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

14

这似乎是一个本质上简单的任务,但我发现从整个数据框中删除''并返回每列中的数字值非常困难,包括没有''的数字。这个数据框包括数百个更多的列,简要地看起来像这样:

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的数据框中,是否有一种非常简单的方法只去掉“*”符号?

4个回答

19

使用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
在替换之后添加 df = df.astype(float) 就可以了。我建议跳过 inplace ,只需执行 df = df.replace('\*', '', regex=True).astype(float) 即可。 - piRSquared
1
@piRSquared 使用“inplace”是一种不好的做法吗? - shivsn
1
不,这只是个人偏好。在这种情况下,当您使用 inplace 时,它不会返回自身,从而无法进行链接。没有使用 inplace,我可以链接 astype(float)。 - piRSquared

4
我发现这是一种简单的方法 - 使用replace仅保留数字(以及dotminus符号)。

这将删除字符、字母或任何未在to_replace属性中定义的内容。

所以,解决方案是:

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

4

我发现CuriousCoder的回答很简洁实用,但应该是')'而不是']'。 因此正确的写法应该是:

最初的回答:

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

2
CuriousCoder的回答已经被编辑以修复拼写错误。因此,这篇帖子不再需要了。在将来,请建议进行编辑而不是发布单独的答案。 - Gino Mempin
这个答案是在 type 被修复之前提供的,它仍然是解决问题的一种尝试。只要缺少最小的标点符号/数字/逗号,任何东西,特别是 regex 都可能出错。我想鼓励用户并保留这个答案。 - bonCodigo

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

解析过程仅适用于所需列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接