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

一种似乎可行的方法(至少在 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

我也很想知道这是否可能,从文档来看似乎并非如此。您可能会做的是逐行读取文件,并将每次读取连接到 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

行。不知道这是多么有效 - 但这是我所做的。很想听听是否有更好的方法来做到这一点。谢谢 !

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 回答