附加数据框列的模式只会在数据框的第一行中创建值

时间:2019-05-26 21:18:04

标签: python pandas dataframe

过去遇到过一些损坏的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引起的跟进错误

1 个答案:

答案 0 :(得分:0)

此行不是返回/分配标量值,而是返回numpy数组:

chunk['good delimeter'] = chunk["delimeters"].mode()

将其更改为:

chunk['good delimeter'] = chunk["delimeters"].mode()[0]

这将为所有类型为numpy.float64的行分配模式值。