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

Jac*_*ard 67 python pandas

我有一个看起来像这样的数据集(最多5列 - 但可以更少)

1,2,3
1,2,3,4
1,2,3,4,5
1,2
1,2,3,4
....
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误 - "列名有5个字段,数据有3个字段".

在阅读数据时,有没有办法让pandas为缺少的列填充NaN?

DSM*_*DSM 72

一种似乎有用的方法(至少在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
Run Code Online (Sandbox Code Playgroud)

请注意,此方法要求您为所需的列指定名称.不像其他一些方式那样通用,但在适用时效果很好.

  • 这现在正常工作BTW没有`engine ='python' (12认同)
  • 对我来说解决这个问题的是“names=my_cols”,其中“my_cols”至少与包含最多字段的行一样长。如果事先不知道最大字段数,您可以通过“with open('my.csv') as f: num_cols = max(len(line.split(',')”预先读取文件来动态提取) 对于 f) 中的行;f.seek(0); df = pd.read_csv(f,names = range(num_cols))`但缺点是文件被读取两次。 (4认同)
  • 谢谢!这工作 - 引擎='python'似乎是关键.添加此属性会使read_table和read_csv都起作用. (2认同)
  • 这对我来说似乎很吵.添加github问题:https://github.com/pydata/pandas/issues/2981 (2认同)

her*_*rfz 15

我也有兴趣知道这是否可行,从文档来看似乎并非如此.您可能要做的是逐行读取文件,并将每个读取连接到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 )
Run Code Online (Sandbox Code Playgroud)

它的工作原理但不是最优雅的方式,我猜......