过去遇到过一些损坏的csv文件后,我正在研究一个smale python代码,该代码可以过滤掉这些错误的行,以便我可以手动检查它们的模式,并在可能的情况下进行修复。
但是,当希望追加适当数量的列时,我希望文件只有第一行而不是所有行都对分隔符进行“模式”最频繁的观察。
这种损坏的csvs文件通常是在行的分隔符比其实际包含的列多的情况下出现的(例如,如果客户端的名称也有一个;然后excel也将其拆分,因此将所有列都移动到正确)我要加载的每个块都看到第一列中的定界符数量与该块的“正确”定界符数量进行比较(我通过使用mode作为共识来简化了此过程),然后将此错误行发送至清单。
我相信错误来自我如何使用熊猫,我是编码新手,而熊猫似乎非常适合处理数据,但我仍然在阅读有关如何正确处理列和行的很多知识。
代码经过我的数百个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:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
但是我认为这是由Nan引起的跟进错误
答案 0 :(得分:0)
此行不是返回/分配标量值,而是返回numpy
数组:
chunk['good delimeter'] = chunk["delimeters"].mode()
将其更改为:
chunk['good delimeter'] = chunk["delimeters"].mode()[0]
这将为所有类型为numpy.float64的行分配模式值。