【问题标题】:Appending the mode of a dataframe column only creates value in first row of dataframe附加数据框列的模式仅在数据框的第一行中创建值
【发布时间】: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 引起的后续错误

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

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

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

    改成:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多