【问题标题】:Splitting a csv files with inconsistent column numbers拆分列号不一致的 csv 文件
【发布时间】:2019-04-12 17:36:17
【问题描述】:

我有一个格式如下的 CSV 文件,除了大约 2000 万行:

A,B,C,D
1,2,3,4
1,1,3,4
1,0,0,1,4,3
1,0,5,6,2,1

我尝试用这样的熊猫阅读:

df = pd.read_csv(_out_path, sep=',', engine='c') # engine c because it's faster

这会导致以下错误:

ParserError: Error tokenizing data. C error: Expected 18 fields in line 13674206, saw 31

使用上面的测试文件,pandas 会处理这个问题,并添加两个未命名的列,其中前两行包含 np.NAN。

A   B   C   D   Unnamed: 4  Unnamed: 5
0   1   2   3   4   NaN NaN
1   1   1   3   4   NaN NaN
2   1   0   0   1   4.0 3.0
3   1   0   5   6   2.0 1.0

但是,对于真实文件(很遗憾,我无法共享),它会导致上述错误。

我正在寻找一种解决方法,方法是找到逗号最多的行,计算逗号的 Nr 并根据需要在每一行附加尽可能多的逗号,以便 pandas 读取文件。 或者理想情况下是一种更简单的方式来读取文件。


编辑:

数据已从数百个 CSV 文件中连接起来,但在中间添加了新列(不幸的是,最后不是全部)。 因此,一个好的解决方案(感谢 cmets)是拆分条目 nr 更改的文件。

此外,文件中没有标题。我尝试在此示例的第一行手动添加它们,所以我想我必须在拆分文件后添加标题。

【问题讨论】:

  • 如果你不需要额外的列,你可以试试usecols=[0,1,2,3]。或者,您可以使用error_bad_lines=False warn_bad_lines=True 跳过并记录错误行。 pandas.pydata.org/pandas-docs/stable/user_guide/io.html
  • 显然这是对数百个 csvs 的合并。添加一些点,他们开始添加更多数据列......不幸的是,它被添加到了中间的某个地方,现在我需要的数据已经发生了变化。我的想法是使用额外列是否为 na 的条件拆分为数据框,然后重新排列列。或者,我可以根据每行逗号的 nr 拆分 CSV 文件,但我不知道该怎么做
  • 这太残忍了。无论谁决定应该将这些数据连接起来,都应该受到制裁。如果您愿意提出问题以便它要求拆分数据,我愿意写一个答案。最好知道列数增加的行是否有新的标题,或者是否只有第一行之后的数字。
  • 我编辑了问题以添加拆分

标签: python python-3.x pandas


【解决方案1】:

为了获得干净的数据集,最好将它们拆分为单独的文件。

如果列数只增不减,您可以使用字典轻松跟踪不​​同的目标文件:

source_file = open('mixed_data.csv', 'r')

destination_files = {}

for line in source_file:
    item_count = len(line.split(','))

    try:
        dest_file = destination_files[item_count]

    except KeyError:
        file_name = 'split_data_' + str(item_count) + '.csv'
        dest_file = destination_files[item_count] = open(file_name, 'w')

    dest_file.write(line)

for dest_file in destination_files.values():
    dest_file.close()

source_file.close()

如果程序在此之后立即结束或者文件对象绑定的范围被留下,则关闭不是绝对必要的,但无论如何这是一个好习惯。

【讨论】:

  • 我怀疑数千万行可能需要一些时间。 open() 有一些可选参数,可以在其中配置不同类型的缓冲(如果 Python 的版本不太旧),这可能会或可能不会加快速度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多