79

私はこのようなデータセットを持っています(最大5列ですが、それより少なくてもかまいません)

1,2,3
1,2,3,4
1,2,3,4,5
1,2
1,2,3,4
....

pandas read_tableを使用して、これを5列のデータフレームに読み込もうとしています。追加のマッサージなしでこれを読みたいと思います。

やってみたら

import pandas as pd
my_cols=['A','B','C','D','E']
my_df=pd.read_table(path,sep=',',header=None,names=my_cols)

「列名には5つのフィールドがあり、データには3つのフィールドがあります」というエラーが発生します。

データの読み取り中にパンダに不足している列のNaNを入力させる方法はありますか?

4

3 に答える 3

81

動作するように見える 1 つの方法 (少なくとも 0.10.1 および 0.11.0.dev-fc8de6d):

>>> !cat ragged.csv
1,2,3
1,2,3,4
1,2,3,4,5
1,2
1,2,3,4
>>> my_cols = ["A", "B", "C", "D", "E"]
>>> pd.read_csv("ragged.csv", names=my_cols, engine='python')
   A  B   C   D   E
0  1  2   3 NaN NaN
1  1  2   3   4 NaN
2  1  2   3   4   5
3  1  2 NaN NaN NaN
4  1  2   3   4 NaN

ただし、このアプローチでは、必要な列に名前を付ける必要があることに注意してください。他のいくつかの方法ほど一般的ではありませんが、適用すると十分に機能します。

于 2013-03-06T15:55:05.310 に答える
18

これが可能かどうかも知りたいのですが、ドキュメントからはそうではないようです。おそらくできることは、ファイルを1行ずつ読み取り、各読み取りをDataFrameに連結することです。

import pandas as pd

df = pd.DataFrame()

with open(filepath, 'r') as f:
    for line in f:
        df = pd.concat( [df, pd.DataFrame([tuple(line.strip().split(','))])], ignore_index=True )

それは機能しますが、最もエレガントな方法ではないと思います...

于 2013-03-06T09:58:12.473 に答える
1

Ok。これがどれほど効率的かはわかりませんが、これが私がやったことです。これを行うためのより良い方法があるかどうかを知りたいです。ありがとう !

from pandas import DataFrame

list_of_dicts=[]
labels=['A','B','C','D','E']
for line in file:
    line=line.rstrip('\n')
    list_of_dicts.append(dict(zip(labels,line.split(','))))
frame=DataFrame(list_of_dicts)
于 2013-03-06T15:40:49.830 に答える