我有一个看起来像这样的数据集(最多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个字段”。
在阅读数据时,有没有办法让pandas为缺少的列填充NaN?
答案 0 :(得分:65)
一种似乎有用的方法(至少在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
请注意,此方法要求您为所需的列指定名称。不像其他方式那样通用,但在适用时效果很好。
答案 1 :(得分:12)
我也有兴趣知道这是否可行,从文档来看似乎并非如此。你可能做的是逐行读取文件,并将每个读数连接到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 )
它有效,但不是以最优雅的方式,我猜......
答案 2 :(得分: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)