【问题标题】:How to merge multiple rows of same dataframe? Or How to merge multiple values of same key pair in python?如何合并多行相同的数据框?或者如何在python中合并同一密钥对的多个值?
【发布时间】:2020-12-24 16:09:53
【问题描述】:
data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]

如果我有这样一个数据然后转换为数据帧,我如何合并键值对以获得这个数据帧

index       data_title            values                                                  
0               a                   1                 
1               b                 3,4,5                  
2               c                   5 

【问题讨论】:

  • 尝试data = {'value':{'a': [0], 'b': [1, 2, 3], 'c': [4, 5]}}data = { 'data_title': ['a','b','b','b','c','c'],'value' : [1,3,4,5,5,5] }gropby('data_title') 只需通过一些循环魔术将您的数据转换为以下格式。

标签: python pandas list dataframe dictionary


【解决方案1】:

以下代码应该可以帮助您解决问题。如果您需要聚合值列表,请选择选项 2,但如果您需要聚合值字符串,请选择选项 1

import pandas as pd

data = [{'a': 1}, {'b': 3}, {'b': 4}, {'b': 5}, {'c': 5}, {'c': 5}]

#converting list of Dict into dataframe
df = pd.DataFrame([(i, j) for a in data for i, j in a.items()],
                  columns=['data_title', 'values'])

#option 1 : for converting the aggregate column into a string of conc values
df_str = df.groupby('data_title').aggregate(
    lambda x: ', '.join(map(str, set(x)))).reset_index()

print(df_str)

#option 2 :  for converting the aggregate column into a list of conc values
df_aslist = df.groupby('data_title').aggregate(lambda x: list(x)).reset_index()

print(df_aslist)

输出:

Option 1:
  data_title   values
0          a        1
1          b  3, 4, 5
2          c        5

Option 2:
  data_title     values
0          a        [1]
1          b  [3, 4, 5]
2          c     [5, 5]

【讨论】:

    【解决方案2】:

    这是获得所需内容的一种方法。我不确定为什么,确切地说,你想要得到那个输出,但我相信你有一个很好的理由。 :)

    import pandas as pd
    
    data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]
    
    # Convert to Pandas DataFrame
    df = pd.DataFrame(data)
    
    # At first, your data look like this
    print(df)
         a    b    c
    0  1.0  NaN  NaN
    1  NaN  3.0  NaN
    2  NaN  4.0  NaN
    3  NaN  5.0  NaN
    4  NaN  NaN  5.0
    5  NaN  NaN  5.0
    
    # Now chain a few operations together:
    # 1) "stack" the values to go from a "wide" data format to a "tall, narrow" format
    # 2) reset the index so we have only columns, not a Pandas index
    # 3) drop the first column (the old index) called "level_0"
    df2 = df.stack().reset_index().drop(columns='level_0')
    
    # Assign better names to the columns:
    df2.columns = ('data_title', 'values')
    

    df2 现在看起来像这样:

    print(df2)
      data_title  values
    0          a     1.0
    1          b     3.0
    2          b     4.0
    3          b     5.0
    4          c     5.0
    5          c     5.0
    

    现在要查找按每个 data_title 分组的唯一值:

    # Group by the "data_title" column, and find unique values from the "values" column
    # Then reset the index again
    df3 = df2.groupby('data_title')['values'].unique().reset_index()
    

    这给了你这个,其中每个“值”记录是一个 Python list 的唯一值:

    print(df3)
      data_title           values
    0          a            [1.0]
    1          b  [3.0, 4.0, 5.0]
    2          c            [5.0]
    

    但是,我认为更大的问题是,您实际上想要完成什么?这之后的下一步是什么?我猜如果我知道这个更大问题的答案,我们可以采取更直接的路线到达您的目的地。

    这让我想起了一个笑话,爱尔兰有人问如何去都柏林,那个人回答说“我不会从这里开始”。 :)

    【讨论】:

      【解决方案3】:

      我相信可能有比这更简单的方法,通过一些基本的列表理解,您也可以获得结果。

      import pandas as pd
      
      data = [{'a': 1}, {'b': 3},{'b':4},{'b':5}, {'c': 5}, {'c':5}]
      
      data = {
          'data_title':[k for o in data for k in list(o.keys())],
          'value':[v for o in data for v in list(o.values())] 
      }
      
      df = pd.DataFrame(data)
      df.groupby('data_title')['value'].unique().reset_index()
      

      【讨论】:

        【解决方案4】:

        首先,您需要删除 NaN 值,因为这些值不允许您按照自己的方式组合数字: T 将转置 DataFrame 并用行切换列,stack 会将所有列放在一列中创建多索引:

        df2 = pd.DataFrame(df.T.stack()) 
        
                0
        a   0   1.0
        b   1   3.0
            2   4.0
            3   5.0
        c   4   5.0
            5   5.0
        

        重置索引将允许您提取正确的列值

        df2 = df2.reset_index()[['level_0', 0]]
        

        因为您希望将值与, 连接起来,您需要将类型转换为str。请注意,.astype(int) 将从值中删除 decimal

        df2[0] = df2[0].astype(int).astype(str)
        
           level_0  0
        0      a    1
        1      b    3
        2      b    4
        3      b    5
        4      c    5
        5      c    5
        

        现在您可以使用group_by0 列中的唯一值放在level_0 列中:

        df2 = df2.groupby(by='level_0', axis=0)[0].unique().apply(','.join)
        

        由于您在此阶段只有一列,因此 df2 变为 Series,我们需要将其转换回 Dataframe 并执行最终的 reset_index

        df2 = pd.DataFrame(df2).reset_index()
        
            level_0 0
        0      a    1
        1      b    3,4,5
        2      c    5
        

        您可以在此处更改列名,这应该与您想要的结果相匹配。

        df2.rename(columns={'level_0':'data_title', 0:'values'}, inplace=True)
        

        【讨论】:

          猜你喜欢
          • 2019-02-25
          • 1970-01-01
          • 2012-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-02
          • 1970-01-01
          • 2020-01-23
          相关资源
          最近更新 更多