2016-07-09 78 views
5

这似乎是一项固有的简单任务,但我发现从我的整个数据框中删除''并返回每列中的数值非常困难,包括没有的数字''。该dateframe包括数百列,看起来像这样在短:删除熊猫数据框中的特殊字符

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 

有一个非常简单的方法,在大熊猫数据帧只删除了“*”?

回答

7

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 
+2

在替换之后添加'df = df.astype(float)',你已经得到了它。我会跳过'inplace',只是做'df = df.replace('\ *','',regex = True).astype(float)'并且称它为好。 – piRSquared

+0

@piRSquared使用'inplace'是不好的做法。 – shivsn

+0

不,只是偏好。在这种情况下,当你在就地使用它时,它不会自动返回以允许链接。没有它,我能够链接astype(float) – piRSquared

0

存在使用地图和带功能的另一解决方案。 你可以看到下面的链接: 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 

的解析过程只在所需的列上。