使用Pandas将CSV读取到具有不同行长的dataFrame中

caa*_*aax 6 python csv dataframe pandas

所以我有一个看起来像这样的CSV:

1 | 01-01-2019 | 724
2 | 01-01-2019 | 233 | 436
3 | 01-01-2019 | 345
4 | 01-01-2019 | 803 | 933 | 943 | 923 | 954
5 | 01-01-2019 | 454
...
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下代码生成dataFrame时。

df = pd.read_csv('data.csv', header=0, engine='c', error_bad_lines=False)
Run Code Online (Sandbox Code Playgroud)

它仅将3列的行添加到df(上方的第1、3和5行)

其余的被认为是“坏线”,给我以下错误:

Skipping line 17467: expected 3 fields, saw 9
Run Code Online (Sandbox Code Playgroud)

如何创建包含csv中所有数据的数据框,可能只是用null填充空单元格?还是在添加到df之前必须声明最大行长?

谢谢!

ALo*_*llz 9

如果使用 only pandas,则逐行读取,然后处理分隔符。

import pandas as pd

df = pd.read_csv('data.csv', header=None, sep='\n')
df = df[0].str.split('\s\|\s', expand=True)

   0           1    2     3     4     5     6
0  1  01-01-2019  724  None  None  None  None
1  2  01-01-2019  233   436  None  None  None
2  3  01-01-2019  345  None  None  None  None
3  4  01-01-2019  803   933   943   923   954
4  5  01-01-2019  454  None  None  None  None
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 8

如果您知道数据包含N列,您可以通过names参数提前告诉 Pandas 需要多少列:

import pandas as pd
df = pd.read_csv('data', delimiter='|', names=list(range(7)))
print(df)
Run Code Online (Sandbox Code Playgroud)

产量

   0             1    2      3      4      5      6
0  1   01-01-2019   724    NaN    NaN    NaN    NaN
1  2   01-01-2019   233  436.0    NaN    NaN    NaN
2  3   01-01-2019   345    NaN    NaN    NaN    NaN
3  4   01-01-2019   803  933.0  943.0  923.0  954.0
4  5   01-01-2019   454    NaN    NaN    NaN    NaN
Run Code Online (Sandbox Code Playgroud)

如果你有一个上限,N, 列数,那么你可以让 Pandas 读取N列,然后dropna用来删除完全空的列:

import pandas as pd
df = pd.read_csv('data', delimiter='|', names=list(range(20))).dropna(axis='columns', how='all')
print(df)
Run Code Online (Sandbox Code Playgroud)

产量

   0             1    2      3      4      5      6
0  1   01-01-2019   724    NaN    NaN    NaN    NaN
1  2   01-01-2019   233  436.0    NaN    NaN    NaN
2  3   01-01-2019   345    NaN    NaN    NaN    NaN
3  4   01-01-2019   803  933.0  943.0  923.0  954.0
4  5   01-01-2019   454    NaN    NaN    NaN    NaN
Run Code Online (Sandbox Code Playgroud)

请注意,如果它们完全为空,这可能会从数据集的中间删除列(不仅仅是右侧的列)。