2016-07-09 112 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 

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