我正在使用Pandas函数pd.read_csv
导入以|
分隔的txt文件。列标题具有419个字段,因此将它们全部计算出来。但是,有些行有419列以上。
那么我将如何使数据框可延展到需要的列数,或者仅增加X列数以允许将来增加列数。
示例:
我如何解释“ F”?
A B C D E
A B C D E
A B C D E F
这是我收到的错误。我在Jupyter笔记本中使用python 3。
ParserError:标记数据时出错。 C错误:在7945行中预期有419个字段,看到了424
这是我要使用的代码
data = pd.read_csv('filepath.txt', sep="|",skip_blank_lines=True, encoding = 'latin-1', header= None)
答案 0 :(得分:2)
通过设置,您必须先阅读每行,才能知道列数。那不会有效。一种方法是将数据读取到列表列表中,并根据需要附加任意数量的NaN
值。然后输入pd.DataFrame
构造函数。
这是一个例子:
from io import StringIO
import csv
import numpy as np
x = StringIO("""A|B|C|D|E
A|B|C|D|E
A|B|C|D|E|F""")
# replace x with open('file.csv', 'r')
with x as fin:
data = list(csv.reader(fin, delimiter='|'))
num = max(map(len, data))
data = [i+[np.nan]*(num-len(i)) for i in data]
df = pd.DataFrame(data)
print(df)
0 1 2 3 4 5
0 A B C D E NaN
1 A B C D E NaN
2 A B C D E F
答案 1 :(得分:1)
使用纯熊猫的解决方案:
>>> import pandas as pd
>>> data = pd.read_csv('filepath.txt', sep="|",skip_blank_lines=True, encoding = 'latin-1', header= None)
>>> data
0
0 A B C D E
1 A B C D E
2 A B C D E F
由于我们在数据集中不存在上面指定的定界符(AFAIK),因此我们可以在空白行上进行拆分,因此仅创建一列:
>>> s = data[0].apply(lambda x: x.split())
>>> s
0 [A, B, C, D, E]
1 [A, B, C, D, E]
2 [A, B, C, D, E, F]
Name: 0, dtype: object
遍历列表中的每一行,创建一个字典列:值映射,供以后与pd.DataFrame
构造函数一起使用:
>>> s = s.apply(lambda x: {'col_' + str(i): v for i, v in enumerate(x)})
>>> s
0 {'col_0': 'A', 'col_1': 'B', 'col_2': 'C', 'co...
1 {'col_0': 'A', 'col_1': 'B', 'col_2': 'C', 'co...
2 {'col_0': 'A', 'col_1': 'B', 'col_2': 'C', 'co...
Name: 0, dtype: object
我们将使用pd.DataFrame.from_records
方法,该方法可以获取以下格式的数据:
>>> s = s.values.tolist()
>>> s
[{'col_0': 'A', 'col_1': 'B', 'col_2': 'C', 'col_3': 'D', 'col_4': 'E'}, {'col_0': 'A', 'col_1': 'B', 'col_2': 'C', 'col_3': 'D', 'col_4': 'E'}, {'col_0': 'A', 'col_1': 'B', 'col_2': 'C', 'col_3': 'D', 'col_4': 'E', 'col_5': 'F'}]
>>> df = pd.DataFrame.from_records(s)
>>> df
col_0 col_1 col_2 col_3 col_4 col_5
0 A B C D E NaN
1 A B C D E NaN
2 A B C D E F