2012-09-22 53 views
5

我有一個很大的.txt格式不正確的數據。我想刪除一些行並將其餘數據轉換爲浮點數。我願與'X''XX'刪除行,其餘的我應該轉換爲浮動,像4;00.1數應轉換爲4.001文件看起來是這樣的例子:在python熊貓中刪除DataFrame中的特定行

0,1,10/09/2012,3:01,4;09.1,5,6,7,8,9,10,11 
1,-0.581586,11/09/2012,-1:93,0;20.3,739705,,0.892921,5,,6,7 
2,XX,10/09/2012,3:04,4;76.0,0.183095,-0.057214,-0.504856,NaN,0.183095,12 
3,-0.256051,10/09/2012,9:65,1;54.9,483293,0.504967,0.074442,-1.716287,7,0.504967,0.504967 
4,-0.728092,11/09/2012,0:78,1;53.4,232247,4.556,0.328062,1.382914,NaN,4.556,4 
5,4,11/09/2012,NaN,NaN,6.0008,NaN,NaN,NaN,6.000800,6.000000,6.000800 
6,X,11/09/2012,X,X,5,X,8,2,1,17.000000,33.000000 
7,,11/09/2012,,,,,,6.000000,5.000000,2.000000,2.000000 
8,4,11/09/2012,7:98,3;04.5,5,6,3,7.000000,3.000000,3.000000,2 
9,6,11/09/2012,2:21,4;67.2,5,2,2,7,3,8.000000,4.000000 

我讀得數據框,然後選擇行

from pandas import * 
from csv import * 
fileName = '~/data.txt' 
colName = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 
df = DataFrame(read_csv(fileName, names=colName)) 
print df[df['b'].isin(['X','XX',None,'NaN'])].to_string() 

從去年最後一行的輸出給了我唯一的:

>>> print df[df['b'].isin(['X','XX',None,'NaN'])].to_string() 
    b   c  d  e   f   g   h i   j k l 
a                     
2 XX 10/09/2012 3:04 4;76.0 0.183095 -0.057214 -0.504856 NaN 0.183095 12 NaN 
6 X 11/09/2012  X  X 5.000000   X 8.000000 2 1.000000 17 33 

不拿起第7行,我想通過所有DF不僅一列(原始文件非常大)。

在轉換時我使用如下,但需要首先刪除不需要的行,將其應用到所有df。

convert1 = lambda x : x.replace('.', '') 
convert2 = lambda x : float(x.replace(';', '.')) 
newNumber = convert2(convert1(df['e'][0])) 

選擇行我想從DF刪除後,我嘗試df.pop()但它僅適用於列不是行。我嘗試命名行但不運氣。在這個特殊的.txt文件中,我應該使用行[0,3,8,9]作爲日期格式的'c'列作爲新的df,作爲時間格式的'd'作爲其他作爲浮點格式。我試圖找出相當長的一段時間,但不知道該往哪裏移動,是否可以在熊貓(可能應該是),還是我需要更改爲ndarray或其他任何東西?感謝您的建議

+1

我作爲一個新的用戶,我想知道是什麼這個問題是否被否決? – tomasz74

回答

6

原始過濾器的問題是它檢查'NaN'而不是numpy.nan,這是默認情況下分析空字符串的原因。 如果要過濾所有列,所以你只能得到行,其中沒有元素是「X」或「XX」,做這樣的事情:

In [45]: names = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'] 

In [46]: df = pd.read_csv(StringIO(data), header=None, names=names) 

In [47]: mask = df.applymap(lambda x: x in ['X', 'XX', None, np.nan]) 

In [48]: df[-mask.any(axis=1)] 
Out[48]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 5 entries, 0 to 9 
Data columns: 
a 5 non-null values 
b 5 non-null values 
c 5 non-null values 
d 5 non-null values 
e 5 non-null values 
f 5 non-null values 
g 5 non-null values 
h 5 non-null values 
i 5 non-null values 
j 4 non-null values 
k 5 non-null values 
l 5 non-null values 
dtypes: float64(6), int64(1), object(5) 
+0

太好了。非常感謝 – tomasz74