【发布时间】: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