基于熊猫系列中索引列表的熊猫数据框中的聚合值

假设您有一个带有“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',['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

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

itdudu 回答:基于熊猫系列中索引列表的熊猫数据框中的聚合值

尝试类似:

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
,

让我们试试

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
,

感谢@Beny 和@mozway 的回答。但是,这些仍然没有像我需要的那样高效。我能够采用 mozway 的一些答案,并向其添加合并和分组,从而加快了速度:

    df1 = pd.DataFrame({'id': ['a','b','c'],'vals': [1,2,3]})
    df2 = pd.Series([['b',['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
本文链接:https://www.f2er.com/7807.html

大家都在问