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

时间:2016-07-09 03:16:10

标签: python numpy pandas

这似乎是一项固有的简单任务,但我发现很难删除' '从我的整个数据框中返回每列中的数值,包括没有' '的数字。日期框架包含数百个列,简而言之:

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 个答案:

答案 0 :(得分:9)

使用适用于整个数据帧的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

答案 1 :(得分:0)

还有另一种使用map和strip函数的解决方案。 你可以看到以下链接: Pandas DataFrame: remove unwanted parts from strings in a column.

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

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

答案 2 :(得分:0)

我发现这是一种简单的方法 - 使用replace仅保留数字(以及dotminus符号)。
这将删除字符,字母或任何未在to_replace属性中定义的内容。

所以,解决方案是:
df['A1'].replace(regex=True, inplace=True, to_replace=r'[^0-9.\-]', value=r'']
df['A1'] = df['A1'].astype(float64)

答案 3 :(得分:0)

我发现CuriousCoder的答案是如此简短和有用,但是必须有一个')'而不是']' 所以应该是:

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