【发布时间】:2019-05-26 21:18:03
【问题描述】:
在过去遇到一些损坏的 csv 文件后,我正在编写一个小 Python 代码,它允许过滤掉这些错误的行,以便我可以手动检查它们的模式并在可能的情况下修复它们。
但是,当想要添加适量的列时,我希望文件具有我只在第一行而不是所有行中获得分隔符最常见的“模式”观察。
这种损坏的 csvs 文件通常出现在行的分隔分隔符多于实际列的情况下(例如,如果客户端的名称也有 ; 然后 excel 也将其拆分,因此将所有列移动到对)我希望我加载的每个块查看第一列中的分隔符数量,将其与块的“正确”分隔符数量进行比较(我通过使用模式作为共识来简化这一点),然后简单地将这些错误行发送到列表。
我相信错误来自我如何使用 pandas 我是编码新手,虽然 pandas 似乎非常适合处理数据,但我仍在阅读很多关于如何正确处理列和行的内容。
代码遍历我的数百个 csv 文件,在这种情况下基于绝对不常见的分隔符 | 将它们加载到块中。这将创建一个数据数据框,其中我将整个 csv 行组合在一个字段中,这允许我依次计算正确的分隔符(在这种情况下;)。
la=[]
for filename in all_files:
for chunk in pd.read_csv(filename, sep='|', chunksize=1000000):
chunk['filename'] = os.path.basename(filename)
chunk["delimeters"] = chunk.iloc[:,0].str.count(',')
chunk['good delimeter'] = chunk["delimeters"].mode()
for index, row in chunk.iterrows():
if row['delimeters'] != chunk['good delimeter']:
la.append(row)
else:
print("all good")
print(la)
我目前的主要问题是,当我查看我的块数据帧时,分隔符的计数效果很好,但是模式只附加到第一行,所以当我查看块时,它看起来如下:
Name| Filename| delimetier| good delimeter
A 123 48 48
B 123 48 Nan
C 123 49 Nan
D 123 48 Nan
但是我希望将分隔符列的模式附加到所有,以便我可以将它们与 if 语句进行比较,从而过滤掉错误行。
现在为这篇文章运行此脚本时,我还遇到以下错误:
ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
但我认为这是由 Nan 引起的后续错误
【问题讨论】: