读取所有列合并为一个的csv文件:千位逗号问题

Posted

技术标签:

【中文标题】读取所有列合并为一个的csv文件:千位逗号问题【英文标题】:Reading a csv file with all the columns combined into one: thousands place comma issue 【发布时间】:2017-10-05 19:59:04 【问题描述】:

我想读取一个 csv 文件,该文件使用 python pandas 在一列中的数据框中的所有数据进行格式化。每一列的数据用逗号分隔。

但是,千位也有逗号,所以如果我用逗号分隔,如果一行中的一列包含超过 1,000 的数字,它就无法正常工作。如何去掉千位逗号?

例如:

CustomerID, Month-Date, Column 1, Column 2, Column 3
      1223,   AUG 2017,       10,      100,    1,100    #The last value is 1100 and not 100
      1224,   AUG 2017,       10,        1,        2
      1225,   AUG 2017,    2,110,       10,       13    #the first value is 2100 and not 2

【问题讨论】:

第一行不明确。第一行的值可以是 (1223, 'AUG 2017', 10, 100, 1100) 或 (1223, 'AUG 2017', 10100, 1, 100)。 通常,格式良好的 CSV 文件会使用引号消除这种情况的歧义。如果没有引号(或其他规则),您的数据将无法解析:(您需要返回生成此 CSV 的程序并在那里解决问题。 这在 Pandas IMO 中不值得尝试解决。打开 csv 文件,删除所有逗号。 这是一种新颖的格式。寄回去更换? 是的,我担心是这种情况,但只是检查以确保我没有遗漏任何东西。感谢您的所有帮助! 【参考方案1】:

正如@A.Kot 建议的那样,您可以从xlsx 文件中读取每一行,删除, 功能,然后重新写入熊猫数据框。比如:

from __future__ import print_function
from os.path import join, dirname, abspath
import xlrd

fname = '_xlsx_path_\\data.xlsx'

# Open the workbook
xl_workbook = xlrd.open_workbook(fname)
xl_sheet = xl_workbook.sheet_by_name('Sheet1')

# Print all values, iterating through rows and columns
num_cols = xl_sheet.ncols   # Number of columns
for row_idx in range(0, xl_sheet.nrows):    # Iterate through rows
    for col_idx in range(0, num_cols):  # Iterate through columns
        cell_obj = xl_sheet.cell(row_idx, col_idx)  # Get cell object by row, col
        if row_idx == 0:
            columns = [c.encode("ascii") for c in cell_obj.value.split(',')]
            print(columns)
            print(' ')
        else:
            data_row = [d.encode("ascii") for d in cell_obj.value.split(',')]
            print(data_row)
            print(' ')

【讨论】:

【参考方案2】:

如果您可以指望在列之间的每个逗号后都有一个空格,那么您可以让 pandas 跳过两边都有数字的逗号。

pandas.read_csv(..., sep=', ', ...)
#                         ^^         note the space after the comma

【讨论】:

我希望我能指望逗号后面的空格。这样会更容易,但逗号之间没有任何空格。不过谢谢! @pythonsandpandas 那么你最好的选择是按列的绝对位置。不知道熊猫能不能做到。 确实,pd.read_fwf 可以解析固定宽度的数据文件。但是正确对齐的数据是由另一个用户而不是 OP 编辑​​到问题中的,所以我不确定这是否真的对 OP 有帮助。

以上是关于读取所有列合并为一个的csv文件:千位逗号问题的主要内容,如果未能解决你的问题,请参考以下文章

使用逗号分隔符将单个 CSV 列批量转换为多个

删除逗号,它是 R 中的千位分隔符

导入包含逗号、千位分隔符和尾随减号的 CSV 数据

解析存储为文本的数字,逗号为十进制,点为千位

如何从csv文件中读取包含逗号的列表作为列?

合并具有不同列名但定义相同的多个CSV