使用Pandas处理可变列数 - Python

83 投票
3 回答
60421 浏览
提问于 2025-04-17 18:06

我有一个数据集,长得像这样(最多有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 个回答

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)
19

我也想知道这是否可能,从文档来看似乎不行。你可以尝试逐行读取文件,然后把每一行的内容合并到一个数据框里:

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 )

这样是可行的,但我觉得不是最优雅的做法……

83

有一种方法看起来有效(至少在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

不过要注意,这种方法需要你给想要的列起名字。虽然不如其他一些方法通用,但在适用的时候效果还是不错的。

撰写回答