使用 Python Pandas 从 csv 文件中删除额外的逗号

问题描述 投票:0回答:2

我有一个 csv 文件,其中每行的第一个元素有时包含一个附加逗号作为名称的一部分。由于并非所有元素都放在引号中,因此会导致数据框混乱。我只想将最后n个逗号视为逗号,开头的附加内容应删除。

Example:
"name", "rank", "wealth"
Donald Trump, Jr, "45", "3"
Barack Obama, 44, 0

在此示例中,意思是仅在超过 2 个逗号的行中删除第一个逗号。

python pandas dataframe csv
2个回答
1
投票

根据显示的相同数据,您可以做到这一点。但是,如果您的输入文件非常混乱(即您的样本并不真正具有代表性),那么这可能不起作用。

注:

此代码的输入文件是问题中给出的示例的复制/粘贴

import pandas as pd
import io

MAXCOMMAS = 2

iob = io.StringIO()

with open('csv.csv') as data_in:
    for line in data_in:
        if (commas := line.count(',')) > MAXCOMMAS:
            line = line.replace(',', '', commas-MAXCOMMAS)
        iob.write(line.replace('"', ''))

iob.seek(0)
df = pd.read_csv(iob)
print(df)

输出:

              name   rank   wealth
0  Donald Trump Jr     45        3
1     Barack Obama     44        0

0
投票

在使用 pandas 之前,您可以使用

csv
模块清理文件。这里的规则是,如果一行超过 21 列,则左侧的所有额外列(对于从左到右的读者)都会折叠到一个以逗号分隔的单元格中,该单元格由
csv
模块正确引用写时。使用
csv
模块,以便任何已经正确引用或转义的内容都不会在此过程中混乱。

with open("test.csv", newline="") as infile, open("test-fixed.csv", "w", newline="") as outfile:
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    for row in reader:
        if len(row) > 21:
            n = len(row) - 21 + 1
            row[:n] = [",".join(row[:n])]
            print(n, len(row))
        writer.writerow(row)
© www.soinside.com 2019 - 2024. All rights reserved.