【问题标题】:Merging multiple rows with the same index into one row将具有相同索引的多行合并为一行
【发布时间】:2021-10-23 23:15:53
【问题描述】:

我在电子表格中有一些非常脏的重复数据,我需要清理并提取一些值。基本上我将记录存储在行中,每列一条记录。一旦我达到列限制(假设在下面的示例中为 5),记录“回车”到另一组行中。

以下是数据框输出的示例:

Index Unnamed 1 Unnamed 2 Unnamed 3 Unnamed 4 Unnamed 5
Fruit Banana Orange Apple Grape Tomato
Colour Yellow Orange Green Green Red
Quantity 5 7 2 20 2
NaN NaN NaN NaN NaN NaN
Fruit Pear Watermelon NaN NaN Nan
Colour Green Green NaN NaN Nan
Quantity 4 7 NaN NaN Nan

所以你可以看到我有重复的索引。

最终我想推出一个整理这些数据的 CSV:

Fruit Colour Quantity
Banana Yellow 5
Orange Orange 7
Apple Green 2
... ... ...
Watermelon Green 7

我知道如何使用 iLoc 引用行,但我需要对许多源文件重复此过程,其中确切的行号会发生变化(此数据集上方和下方存在不相关的数据)。

如何将所有水果行、颜色行、数量行连接成一组列,然后我可以转置这些列?我已经尝试过合并、加入、分组,所有常见的嫌疑人,但不太明白!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    考虑到您的初始数据帧 df,您应该删除所有带有 NAN 的行(第 1 行代码),并为您编制索引的“索引”列(第 2 行代码)。

    df = df.dropna(axis=0, how='all')
    df = df.set_index('Index')
    

    由于数据框每 3 行重复一次,因此您应该使用此步骤将数据框拆分为数据框列表。转置 (.T) 使索引 - 水果、颜色和数量成为列。

    n=3
    list_df = [df[i:i+n].T for i in range(0,df.shape[0],n)]
    

    最后,将列表连接回数据框,

    final_df = pd.concat(list_df, ignore_index=True, axis=0)
    

    【讨论】:

      【解决方案2】:

      试试这个:

      df = pd.read_clipboard()
      
      l = []
      for n, g in df.groupby(df['Index'].isna().cumsum()):
          l.append(g.dropna(how='all', axis=0).set_index('Index').T)
          
      df_out = pd.concat(l, ignore_index=True).dropna(how='all')
      df_out
      

      输出:

      Index       Fruit  Colour Quantity
      0          Banana  Yellow        5
      1          Orange  Orange        7
      2           Apple   Green        2
      3           Grape   Green       20
      4          Tomato     Red        2
      5            Pear   Green        4
      6      Watermelon   Green        7
      9             Nan     Nan      Nan
      

      注意:最后一行是上面输入数据框中的“NaN”与“Nan”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-28
        • 2016-01-07
        • 2017-10-19
        • 2017-01-31
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多