python - 由于额外的列值,尝试使用 pandas Python 读取 csv 时出错

标签 python pandas

这是我试图摆脱的场景:
我正在尝试阅读以下类型的 csv:

para1,para2,para3,para4
1,2,3,4,
1,2,3,4,5,
1,2,3,4,
2,3,4,5,6,7,8,9,0,

我正在使用以下命令并收到以下错误:

>>> import pandas as pd
>>> df =pd.read_csv("test.csv")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\site-packages\pandas\io\parsers.py", line 702, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "C:\Python35\lib\site-packages\pandas\io\parsers.py", line 435, in _read
    data = parser.read(nrows)
  File "C:\Python35\lib\site-packages\pandas\io\parsers.py", line 1139, in read
    ret = self._engine.read(nrows)
  File "C:\Python35\lib\site-packages\pandas\io\parsers.py", line 1995, in read
    data = self._reader.read(nrows)
  File "pandas\_libs\parsers.pyx", line 899, in pandas._libs.parsers.TextReader.read
  File "pandas\_libs\parsers.pyx", line 914, in pandas._libs.parsers.TextReader._read_low_memory
  File "pandas\_libs\parsers.pyx", line 968, in pandas._libs.parsers.TextReader._read_rows
  File "pandas\_libs\parsers.pyx", line 955, in pandas._libs.parsers.TextReader._tokenize_rows
  File "pandas\_libs\parsers.pyx", line 2172, in pandas._libs.parsers.raise_parser_error
pandas.errors.ParserError: Error tokenizing data. C error: Expected 4 fields in line 3, saw 5

我试图搜索问题并在 SO 上找到了这个线程:
Python Pandas Error tokenizing data

所以,我试过了。这不是我所期待的。它正在截断值。

>>> df =pd.read_csv("test.csv",error_bad_lines=False)
b'Skipping line 3: expected 4 fields, saw 5\nSkipping line 5: expected 4 fields, saw 9\n'
>>> df


para1  para2  para3  para4
0      1      2      3      4
1      1      2      3      4

我想要的是这样的:
如果有额外的值,则将列作为在额外中找到的最高列的整数值。然后将其余值设置为零(0)直到最后一列并读取 csv。

我期待的输出是这样的:

>>> df =pd.read_csv("test.csv")
>>> df
   para1  para2  para3  para4    0    1    2    3    4
0      1      2      3      4  NaN  NaN  NaN  NaN  NaN
1      1      2      3      4  5.0  NaN  NaN  NaN  NaN
2      1      2      3      4  NaN  NaN  NaN  NaN  NaN
3      2      3      4      5  6.0  7.0  8.0  9.0  0.0
>>> df = df.fillna(0)
>>> df
   para1  para2  para3  para4    0    1    2    3    4
0      1      2      3      4  0.0  0.0  0.0  0.0  0.0
1      1      2      3      4  5.0  0.0  0.0  0.0  0.0
2      1      2      3      4  0.0  0.0  0.0  0.0  0.0
3      2      3      4      5  6.0  7.0  8.0  9.0  0.0

但请注意,我不想照顾专栏。相反,程序必须自动理解并制作上面给出的列标题。

其次,请尽量避免建议我写标题。因为可能有很多列我可能无法编写标题而只是保持原样。因此缺少的列标题将是如上所述的数字整数。有人对查询有任何解决方案吗,请告诉我?

最佳答案

我不确定是否有更简洁的方法来执行此操作,但我对其进行了测试并且它仅使用 pandas 就可以工作:

df = pd.read_csv('test.csv', header=None, sep='\n')
df= df[0].str.split(',', expand=True)
new_header = df.iloc[0].fillna(df.columns.to_series())
df = df[1:]
df.columns = new_header

关于python - 由于额外的列值,尝试使用 pandas Python 读取 csv 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56220380/

相关文章:

javascript - 使用参数向客户端发送websocket消息

python - 如何在 python 中拆分非常长的正则表达式

python - python中的动态变量名

python - 计算管理值(value)的最有效方法

python - Pandas:如何根据特定的后缀值对行进行排序?

python - 使用 pandas/python 连接两个 csv 文件,不重复

python - 带有 q 列表的多级列 MultiIndex groupby 对象上的 Pandas 分位数

python - matplotlib 动画绘图不会使用 blit 更新轴上的标签

python - 升级后 Pandas 系列操作非常缓慢

python Pandas |仅从列的特定部分查找最大值