как использовать это рабочее регулярное выражение (re) на pandas df для удаления лишнего нецифрового символа, звездочки (*)? - PullRequest
0 голосов
/ 12 сентября 2018

Используя приведенный ниже код, я могу использовать re , чтобы изменить строку вроде этой: *12.2 на число с плавающей точкой, например: 12.2:

import re
numeric_const_pattern = '[-+]? (?: (?: \d* \. \d+ ) | (?: \d+ \.? ) )(?: [Ee] [+-]? \d+ ) ?'
rx = re.compile(numeric_const_pattern, re.VERBOSE)
print('converted string to float number is', float(rx.findall("*12.2")[0]))

converted string to float number is 12.2

Но у меня есть панда df, которая:

df = pd.DataFrame([[10, '*41', '-0.01', '2'],['*10.5', 54, 34.2, '*-0.076'], 
                        [65, -32.01, '*344.32', 0.01], ['*32', '*0', 5, 43]])


       0         1         2          3
0      10       *41      -0.01        2
1     *10.5      54       34.2      *-0.076
2      65       -32.01   *344.32      0.01
3     *32       *0        5           43

Как я могу применить вышеописанную функцию к этому df, чтобы удалить все символы звездочки, а также сделать полные pand dtype типа float, как показано ниже?

       0       1       2          3
0      10      41     -0.01       2
1      10.5    54      34.2      -0.076
2      65     -32.01   344.32     0.01
3      32      0       5          43

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Немного многословно, но вот жизнеспособное решение, не основанное на регулярных выражениях, использующее melt и str.rpartition.

v = df.melt()['value'].astype(str).str.rpartition('*')[2]
df = pd.DataFrame(v.values.astype(float).reshape(df.shape))

df
       0       1       2     3
0  10.00  10.500   65.00  32.0
1  41.00  54.000  -32.01   0.0
2  -0.01  34.200  344.32   5.0
3   2.00  -0.076    0.01  43.0
0 голосов
/ 12 сентября 2018

Простой

df.replace('[^\d\.eE+-]', '', regex=True).astype(float)

      0      1       2       3
0  10.0  41.00   -0.01   2.000
1  10.5  54.00   34.20  -0.076
2  65.0 -32.01  344.32   0.010
3  32.0   0.00    5.00  43.000

Чуть более устойчивый

df.replace('[^\d\.eE+-]', '', regex=True).apply(pd.to_numeric, errors='coerce')

      0      1       2       3
0  10.0  41.00   -0.01   2.000
1  10.5  54.00   34.20  -0.076
2  65.0 -32.01  344.32   0.010
3  32.0   0.00    5.00  43.000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...