【问题标题】:Aggregate values in pandas dataframe based on lists of indices in a pandas series根据熊猫系列中的索引列表聚合熊猫数据框中的值
【发布时间】:2021-07-30 19:21:19
【问题描述】:

假设您有一个带有“id”列和一列值的数据框:

df1 = pd.DataFrame({'id': ['a', 'b', 'c'] , 'vals': [1, 2, 3]})
df1
    id  vals
0   a   1
1   b   2
2   c   3

您还有一个系列,其中包含与 df1 中的值相对应的“id”值列表:

df2 = pd.Series([['b', 'c'], ['a', 'c'], ['a', 'b']])
df2
    id    
0   [b, c] 
1   [a, c] 
2   [a, b] 

现在,您需要一种计算效率高的方法,使用 df2 中的相应 ID 获取 df1 中“vals”列的平均值,并在 df1 中创建一个新列。例如,对于第一行 (index=0),我们将取 df1 中 id "b" 和 "c" 的值的平均值(因为这些是 df2 中 index=0 的 id 值):

    id  vals avg_vals
0   a   1    2.5
1   b   2    2.0
2   c   3    1.5

你可以这样做:

df1['avg_vals'] = df2.apply(lambda x: df1.loc[df1['id'].isin(x), 'vals'].mean())
df1
  id  vals  avg_vals
0  a     1       2.5
1  b     2       2.0
2  c     3       1.5

...但是假设它对于您的目的来说太慢了。即,如果可能的话,我需要计算效率更高的东西!提前感谢您的帮助。

【问题讨论】:

  • 你能看看我的updated answer吗?我现在可以测试它并且效果很好

标签: python pandas performance aggregate


【解决方案1】:

让我们试试

df1['new'] = pd.DataFrame(df2.tolist()).replace(dict(zip(df1.id,df1.vals))).mean(1)
df1
Out[109]: 
  id  vals  new
0  a     1  2.5
1  b     2  2.0
2  c     3  1.5

【讨论】:

    【解决方案2】:

    尝试类似:

    df1['avg_vals'] = (df2.explode()
                          .map(df1.set_index('id')['vals'])
                          .groupby(level=0)
                          .mean()
                      )
    

    输出:

      id  vals  avg_vals
    0  a     1       2.5
    1  b     2       2.0
    2  c     3       1.5
    

    【讨论】:

    • 感谢您的回答——它帮助我创建了一种更有效的方法。
    【解决方案3】:

    感谢@Beny 和@mozway 的回答。但是,这些仍然没有达到我需要的效率。我能够采取一些 mozway 的答案并添加一个合并和 groupby 以加快速度:

        df1 = pd.DataFrame({'id': ['a', 'b', 'c'] , 'vals': [1, 2, 3]})
        df2 = pd.Series([['b', 'c'], ['a', 'c'], ['a', 'b']])
        df2 = df2.explode().reset_index(drop=False)
    
        df1['avg_vals'] = pd.merge(df1, df2, left_on='id', right_on=0, how='right').groupby('index').mean()['vals'] 
    
        df1
        id  vals  avg_vals
        0  a     1       2.5
        1  b     2       2.0
        2  c     3       1.5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 2021-01-27
      • 2019-10-12
      • 2014-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多