2016-04-07 52 views
2

我正在讀一箇舊的學校數據庫到大熊貓tsv表。大熊貓read_csv忽略不符合的行

的數據是這樣的:

Iron Oxide (FeO) Fe1O1(cr,l) 
T(K) Cp  S  -[G-H(Tr)]/T H-H(Tr) delta-f H delta-f G log Kf 
0              
100              
200              
298.15 49.915 60.752 60.752   0.  -272.044 -251.429 44.049 
300  49.999 61.061 60.753   0.092 -272.025 -251.301 43.755 
400  51.840 75.704 62.737   5.187 -271.044 -244.543 31.934 
. 
. 
. 

第一行我跳過。第二行是一個8列標題(製表符分隔)。接下來的三行有一個數字和10個選項卡,之後的每一行都是8個字段。所以這三行是一個問題。

如果我試着去閱讀它,像這樣:

import pandas as pd 
FeO = pd.read_csv('JANAF-FeO.txt', skiprows=(0,), delimiter='\t', header=0) 

然後我得到這個:

enter image description here

所以不是我可以告訴熊貓手動跳過這些三行:

import pandas as pd 
FeO = pd.read_csv('JANAF-FeO.txt', skiprows=(0,2,3,4), delimiter='\t', header=0) 

這很好,我得到這個:

enter image description here

如果我只是讀一個文件,這將是很好,我會跳過這些行來完成。但是有很多文件,其中一些文件的可變數字有幾行,有8列以上。那麼是否有辦法讓大熊貓自動忽略與標題格式不匹配的行?

+0

如果你有一堆雜亂的數據,大熊貓可以幫助,但我不認爲一個自定義分析器可爲您服務。你可能不得不找出一些啓發式的方法來過濾/將線條變成理智的東西並從那裏出發。 – U2EF1

+0

還有更多的8列 - 已知最大列數? – jezrael

+0

總是應該有8列。 – ZSG

回答

2

聽起來像你的問題是多餘的標籤掛在奇數的單值線上。

幸運的是,sep參數使用正則表達式。我重新創建了你的數據集,盡我所能,並從下面的read_csv中獲得了一個像樣的df:

ipdb> test = pd.read_csv('test.txt', skiprows=(1), header=(0), sep='\t*') 
ipdb> test 
T(K)  Cp  S -[G-H(Tr)]/T H-H(Tr) delta-f H delta-f G log Kf 
0 0.00  NaN  NaN   NaN  NaN  NaN  NaN  NaN 
1 100.00  NaN  NaN   NaN  NaN  NaN  NaN  NaN 
2 200.00  NaN  NaN   NaN  NaN  NaN  NaN  NaN 
3 298.15 49.915 60.752  60.752 0.100 -272.044 -251.429 44.049 
4 300.00 49.999 61.061  60.753 0.092 -272.025 -251.301 43.755 
5 400.00 51.840 75.704  62.737 5.187 -271.044 -244.543 31.934 

希望這有助於!

1

如果您需要更多的通用解決方案,嘗試:

#number 15 in range(15) depends of max number of tabs, in my test data 
df1 = pd.read_csv('JANAF-FeO.txt', delimiter='\t', names=(range(15))) 

#remove columns with all NaN 
df1 = df1.dropna(axis=1, how='all') 
df1.columns = df1.iloc[1,:] 
df1 = df1[2:] 

#mask if there are not 7 times NaN in line 
mask = df1.isnull().sum(axis=1) != 7 
df1 = df1[mask] 

print df1