删除 pandas 数据框中的特殊字符

问题描述 投票:0回答:5

这看起来本质上是一个简单的任务,但我发现从整个数据框中删除“”并返回每列中的数值(包括没有“”的数字)非常困难。日期框包含数百个以上的列,简而言之如下所示:

Time            A1      A2
2.0002546296    1499    1592
2.0006712963    1252    1459
2.0902546296    1731    2223
2.0906828704    1691    1904
2.1742245370    2364    3121
2.1764699074    2096    1942
2.7654050926    *7639*  *8196*
2.7658564815    *7088*  *7542*
2.9048958333    *8736*  *8459*
2.9053125000    *7778*  *7704*
2.9807175926    *6612*  *6593*
3.0585763889    *8520*  *9122*

我还没有编写它来迭代 df 中的每一列,但就第一列而言,我已经想出了这个

df['A1'].str.replace('*','').astype(float)

产生

0        NaN
1        NaN
2        NaN
3        NaN
4        NaN
5        NaN
6        NaN
7        NaN
8        NaN
9        NaN
10       NaN
11       NaN
12       NaN
13       NaN
14       NaN
15       NaN
16       NaN
17       NaN
18       NaN
19    7639.0
20    7088.0
21    8736.0
22    7778.0
23    6612.0
24    8520.0

有没有一种非常简单的方法可以删除 pandas 数据框中的“*”?

python numpy pandas
5个回答
20
投票

使用适用于整个数据框的replace

df
Out[14]: 
       Time      A1      A2
0  2.000255    1499    1592
1  2.176470    2096    1942
2  2.765405  *7639*  *8196*
3  2.765856  *7088*  *7542*
4  2.904896  *8736*  *8459*
5  2.905312  *7778*  *7704*
6  2.980718  *6612*  *6593*
7  3.058576  *8520*  *9122*

df=df.replace('\*','',regex=True).astype(float)

df
Out[16]: 
       Time    A1    A2
0  2.000255  1499  1592
1  2.176470  2096  1942
2  2.765405  7639  8196
3  2.765856  7088  7542
4  2.904896  8736  8459
5  2.905312  7778  7704
6  2.980718  6612  6593
7  3.058576  8520  9122

4
投票

我发现 CuriousCoder 的答案如此简短且有用,但必须有一个

')'
而不是
']'
所以应该是:

df['A1'].replace(regex=True, inplace=True, to_replace=r'[^0-9.\-]',
value=r''] df['A1'] = df['A1'].astype(float64)

4
投票

我发现这是一个简单的方法 - 使用

replace
仅保留数字(以及
dot
minus
符号)。

这将删除字符、字母或

to_replace
属性中未定义的任何内容。

所以,解决办法是:

df['A1'].replace(regex=True, inplace=True, to_replace=r'[^0-9.\-]', value=r'')
df['A1'] = df['A1'].astype(float64)

3
投票

还有另一种解决方案,使用map和strip函数。 你可以看到下面的链接: Pandas DataFrame:从列中的字符串中删除不需要的部分。

df = 
    Time     A1     A2
0   2.0     1258    *1364*
1   2.1     *1254*  2002
2   2.2     1520    3364
3   2.3     *300*   *10056*

cols = ['A1', 'A2']
for col in cols:
    df[col] = df[col].map(lambda x: str(x).lstrip('*').rstrip('*')).astype(float)

df = 
    Time     A1     A2
0   2.0     1258    1364
1   2.1     1254    2002
2   2.2     1520    3364
3   2.3     300     10056

解析过程仅应用于所需的列。


0
投票

使用剥离功能 df['A1'] = df['A1'].str.strip("*")

如果您只想从左侧删除,请使用 lstrip;如果您想从右侧删除,请使用 rstrip df['A1'] = df['A1'].str.lstrip("") df['A1'] = df['A1'].str.rstrip("") 您可以一次删除不同的字符 例如: df['A1'] = df['A1'].str.strip("*/&")

© www.soinside.com 2019 - 2024. All rights reserved.