向Pandas数据框添加更多列

时间:2018-11-27 15:59:56

标签: python pandas csv dataframe

我正在使用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)

2 个答案:

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