2016-04-07 5 views
2

私は古い学校のデータベースからtsvテーブルをPandasに読み込んでいます。Pandas 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 
. 
. 
. 

私はスキップ最初の行:

データは次のようになります。 2行目は8列のヘッダー(タブ区切り)です。次の3行には数字と10のタブがあり、それ以降のすべての行は8フィールドです。だから3行は問題です。

私はそうのようにそれを読み込むしようとした場合:だからではなく、私は手動でこれらの3つのラインスキップするパンダを伝えることができ

enter image description here

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

その後、私はこれを取得

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

これは問題ありません。

私は1つのファイルだけを読んでいた場合

enter image description here

、それは大丈夫だと思う、私はそれらの行をスキップしてしまう行われます。しかし、多くのファイルがあり、そのうちのいくつかは8列以上の数行の可変数を持っています。それで、パンダに、ヘッダのフォーマットと一致しない行を自動的に無視させる方法がありますか?

+0

をあなたは厄介なデータの束を持っている場合は、パンダを助けることができますが、私は、カスタムパーサーはあなたのために利用可能であるとは思いません。おそらく、線を何かにフィルタリング/モーフィングしてそこから行くいくつかのヒューリスティックを理解しなければならないでしょう。 – U2EF1

+0

8つの列があります - 列の最大数はわかっていますか? – jezrael

+0

常に8列にする必要があります。 – ZSG

答えて

2

あなたの問題のような音は、これらの奇妙な1つの値の行に余分なタブがついていることです。

幸いなことに、sep引数には正規表現が使用されます。

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 

・ホープ、このことができます:私は私ができると、次のread_csvからまともな探してDFを得た最良のデータセットを再作成しました!

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 
関連する問題