【问题标题】:pandas failing with variable columns熊猫因可变列而失败
【发布时间】:2016-11-30 05:06:30
【问题描述】:

我的文件是这个

    4 7 a a
    s g 6 8 0 d
    g 6 2 1 f 7 9 
    f g 3 
    1 2 4 6 8 9 0

我使用 pandas 以 pandas 对象的形式保存它。但我收到以下错误
pandas.parser.CParserError: Error tokenizing data. C error: Expected 6 fields in line 3, saw 8

我使用的代码是
file = pd.read_csv("a.txt",dtype = None,delimiter = " ")

任何人都可以提出一个包含该文件的想法吗?

【问题讨论】:

  • 你知道,可以有多少列?或者这也不确定?就像这里,如果 7 是最大列,有办法。
  • 我也不确定列数

标签: python file pandas multiple-columns


【解决方案1】:

这是一种方法。

In [50]: !type temp.csv
4,7,a,a
s,g,6,8,0,d
g,6,2,1,f,7,9
f,g,3
1,2,4,6,8,9,0

读取 csv 到列表列表,然后转换为 DataFrame。

In [51]: pd.DataFrame([line.strip().split(',') for line in open('temp.csv', 'r')])
Out[51]:
   0  1  2     3     4     5     6
0  4  7  a     a  None  None  None
1  s  g  6     8     0     d  None
2  g  6  2     1     f     7     9
3  f  g  3  None  None  None  None
4  1  2  4     6     8     9     0

【讨论】:

  • 谢谢,这就是我要找的东西
【解决方案2】:

使用 pandas 会引发错误,因为函数期望有一定数量的列,在本例中为 6,但当它到达第三行时遇到 8。处理此问题的一种方法是不读取列数多于数据框第一行的行。这可以使用error_bad_lines 参数来完成。这就是文档对error_bad_lines 的评价:

error_bad_lines : 布尔值,默认 True Lines 字段太多 (例如,逗号太多的 csv 行)默认情况下会导致 引发异常,并且不会返回任何 DataFrame。如果为假, 那么这些“坏行”将从 DataFrame 中删除,即 回来。 (仅对 C 解析器有效)

所以你可以这样做:

>>> file = pd.read_csv("a.txt",dtype = None,delimiter = " ",error_bad_lines=False)
Skipping line 3: expected 6 fields, saw 8
Skipping line 5: expected 6 fields, saw 7

>>> file
     4    7    a  a.1
s g  6  8.0  0.0    d
f g  3  NaN  NaN  NaN

或者您可以使用skiprows 参数来跳过您想要的行,这就是文档对skiprows 的说法:

skiprows : 类列表或整数,默认无 要跳过的行号 (0-indexed)或文件开头要跳过的行数(int)

【讨论】:

  • 我应该补充一点,如果您在文件中添加逗号作为分隔符,您可以在数据较少的行中添加额外的逗号,它会正常工作。
  • 我不希望这些行被省略
猜你喜欢
  • 2016-03-17
  • 2014-07-25
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2021-03-24
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多