我有一个 csv 文件,其中每行的第一个元素有时包含一个附加逗号作为名称的一部分。由于并非所有元素都放在引号中,因此会导致数据框混乱。我只想将最后n个逗号视为逗号,开头的附加内容应删除。
Example:
"name", "rank", "wealth"
Donald Trump, Jr, "45", "3"
Barack Obama, 44, 0
在此示例中,意思是仅在超过 2 个逗号的行中删除第一个逗号。
根据显示的相同数据,您可以做到这一点。但是,如果您的输入文件非常混乱(即您的样本并不真正具有代表性),那么这可能不起作用。
注:
此代码的输入文件是问题中给出的示例的复制/粘贴
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
在使用 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)