【问题标题】:How to aggregate, combining dataframes, with pandas groupby如何使用 pandas groupby 聚合、组合数据框
【发布时间】:2021-01-22 18:18:15
【问题描述】:

我有一个数据框df 和一个列df['table'],这样df['table'] 中的每个项目都是另一个具有相同标题/列数的数据框。我想知道是否有办法像这样处理groupby

原始数据框:

name    table
Bob     Pandas df1
Joe     Pandas df2
Bob     Pandas df3
Bob     Pandas df4
Emily   Pandas df5

分组后:

name    table
Bob     Pandas df containing the appended df1, df3, and df4
Joe     Pandas df2
Emily   Pandas df5

我发现这段代码 sn-p 可以对数据帧中的字符串执行 groupby 和 lambda,但无法弄清楚如何将整个数据帧附加到 groupby

df['table'] = df.groupby(['name'])['table'].transform(lambda x : ' '.join(x)) 

我也尝试过df['table'] = df.groupby(['name'])['HTML'].apply(list),但这给了我一个df['table'],而不是所有NaN

感谢您的帮助!!

【问题讨论】:

    标签: python pandas dataframe lambda pandas-groupby


    【解决方案1】:
    • 给定 3 个数据帧
    import pandas as pd
    
    dfa = pd.DataFrame({'a': [1, 2, 3]})
    dfb = pd.DataFrame({'a': ['a', 'b', 'c']})
    dfc = pd.DataFrame({'a': ['pie', 'steak', 'milk']})
    
    • 给定另一个数据框,列中有数据框
    df = pd.DataFrame({'name': ['Bob', 'Joe', 'Bob', 'Bob', 'Emily'], 'table': [dfa, dfa, dfb, dfc, dfb]})
    
    # print the type for the first value in the table column, to confirm it's a dataframe
    print(type(df.loc[0, 'table']))
    [out]:
    <class 'pandas.core.frame.DataFrame'>
    
    • 每组数据帧,可以通过使用.groupby 并为每个组聚合一个list,并将list 中的数据帧与pd.concat 组合成一个数据帧
    # if there is only one column, or if there are multiple columns of dataframes to aggregate
    dfg = df.groupby('name').agg(lambda x: pd.concat(list(x)).reset_index(drop=True))
    
    # display(dfg.loc['Bob', 'table'])
           a
    0      1
    1      2
    2      3
    3      a
    4      b
    5      c
    6    pie
    7  steak
    8   milk
    
    # to specify a single column, or specify multiple columns, from many columns
    dfg = df.groupby('name')[['table']].agg(lambda x: pd.concat(list(x)).reset_index(drop=True))
    

    不重复

    df.groupby('name')['table'].apply(list)
    df.groupby('name').agg(list)
    df.groupby('name')['table'].agg(list)
    df.groupby('name').agg({'table': list})
    df.groupby('name').agg(lambda x: list(x))
    
    • 但是,当有dataframes 需要聚合时,这些都会导致StopIteration 错误。

    【讨论】:

      【解决方案2】:

      这里让我们创建一个以数据框为列的数据框:

      首先,我从三个数据框开始:

      import pandas as pd
      
      #creating dataframes that we will assign to Bob and Joe, notice b's and j':
      
      df1 = pd.DataFrame({'var1':[12, 34, -4, None], 'letter':['b1', 'b2', 'b3', 'b4']})
      df2 = pd.DataFrame({'var1':[1, 23, 44, 0], 'letter':['j1', 'j2', 'j3', 'j4']})
      df3 = pd.DataFrame({'var1':[22, -3, 7, 78], 'letter':['b5', 'b6', 'b7', 'b8']})
      
      #lets make a list of dictionaries:
      list_of_dfs = [
          {'name':'Bob' ,'table':df1},
          {'name':'Joe' ,'table':df2},
          {'name':'Bob' ,'table':df3}
      ]
      
      #constuct the main dataframe:
      original_df = pd.DataFrame(list_of_dfs)
      print(original_df)
      
      original_df.shape #shows (3, 2)
      

      现在我们已经创建了原始数据框作为输入,我们将生成生成的新数据框。为此,我们使用 groupby()、agg() 和 pd.concat()。我们还重置了索引。

      new_df = original_df.groupby('name')['table'].agg(lambda series: pd.concat(series.tolist())).reset_index()
      print(new_df)
      
      #check that Bob's table is now a concatenated table of df1 and df3:
      new_df[new_df['name']=='Bob']['table'][0]
      

      最后一行代码的输出是:

          var1    letter
      0   12.0    b1
      1   34.0    b2
      2   -4.0    b3
      3    NaN    b4
      0   22.0    b5
      1   -3.0    b6
      2    7.0    b7
      3   78.0    b8
      

      【讨论】:

      • 您也可以使用此代码行获得最终输出:new_df.set_index('name').loc['Bob','table']
      猜你喜欢
      • 2013-02-06
      • 2017-06-07
      • 2018-10-17
      • 2021-09-23
      • 2023-03-07
      • 2014-11-23
      • 1970-01-01
      • 2019-08-26
      • 2016-05-24
      相关资源
      最近更新 更多