Mam ogromną ramkę danych złożoną z 7 kolumn. Wyciąg: 45589 664865,0 100000,0 7,62275 -0,494 1,60149 100010 ... 57205 71888,0 100000,0 8,218463 -1,405-3 1,75137 ...

3
elle.delle 28 czerwiec 2021, 15:49

4 odpowiedzi

Najlepsza odpowiedź

Możesz użyć regex negatywnego uprzedzenia i pozytywnego uprzedzenia, aby potwierdzić, że łącznik znajduje się pośrodku w celu zamiany, w następujący sposób:

df = df.replace(r'\s', '', regex=True)      # remove any unwanted spaces 
df = df.replace(r'(?<=.)-(?=.)', 'E-', regex=True)

Wynik:

print(df)

        0         1         2         3          4         5       6
0  45589  664865.0  100000.0   7.62275      -.494   1.60149  100010
1  57205  718888.0  100000.0  8.218463  -1.405E-3   1.75137  100010
2  55143  711827.0  100000.0  8.156107  9.8336E-3  1.758051  100010
2
SeaBean 28 czerwiec 2021, 14:04

Możesz użyć grup określonych w tym wątku, aby wybrać liczbę przed wykładnikiem tak, aby:

  • pierwszy : dopasowanie występuje tylko wtedy, gdy minus jest poprzedzony wartościami
  • a drugi : zamień dopasowanie na E poprzedzone wartościami dopasowanymi przez grupę (na przykład 158-3 zostanie zastąpione „dynamicznie” wartością 158 dopasowaną w grupie 1, wyrażeniem \1 (zawartość grupy 1) i „statycznie " PA-.

To daje :

df.replace({r'(\d*)-' : r'\1E-'}, inplace=True, regex=True)

(Możesz to zweryfikować na testerze regexp)

1
Osamoele 28 czerwiec 2021, 13:22

Próbowałem tego przykładu i pracowałem:

import pandas as pd

df = pd.DataFrame({'A': ['-.494', '-1.405-3', '9.8336-3']})
pat = r"(\d)-"
repl = lambda m: f"{m.group(1)}e-"
df['A'] = df['A'].str.replace(pat, repl, regex=True)
df['A'] = pd.to_numeric(df['A'], errors='coerce')
1
bruno-uy 28 czerwiec 2021, 13:10

Wyrażenia regularne mogą być drogie, na przykład pokrój ciąg na pierwszą cyfrę i pozostałe cyfry, użyj zamiany na pozostałych cyfrach, a następnie ponownie połącz z pierwszą cyfrą. Jednak nie testowałem tego! Coś takiego (zastosowane z df.str_col.apply(lambda x: f(x))

my_str = '-1.23-4'
def f(x):
  first_part = my_str[0]
  remaining_part = my_str[1:]
  remaining_part = remaining_part.replace('-', 'E-')
  return first_part + remaining_part

Lub jako jeden wiersz (zakładając, że siedem kolumn to jedyne kolumny w twoim df, w przeciwnym razie określ kolumny):

df.apply(lambda x: x[0] + x[1:].replace('-', 'E-'))
1
daveydave 28 czerwiec 2021, 13:09