使用Pandas处理可变数量的列 - Python

时间:2013-03-06 08:52:55

标签: python pandas

我有一个看起来像这样的数据集(最多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?

3 个答案:

答案 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)