我想向数据框中添加一列,其中每个唯一用户的移动平均值的值都来自另一列(这里是棘手的部分)。
首先想到的是获取所有唯一用户的列表并遍历所有用户,获取用户列等于该用户的数据帧子集:
import pandas as pd
df = pd.DataFrame()
df['user'] = [1,2,3,2,2,1,1,3,3,3,3,3,3,2,1,2,1,2,1,1]
df['value'] = [3,1,5,7,2,2,2,9,8,7,6,5,4,3,2,2,2,1,2,3]
unique_users = df['user'].unique()
df['rolled_value'] = 0
for user in unique_users:
temp_df = df[df['user'] == user]
temp_df['rolled_value'] = temp_df['value'].rolling(2).mean()
它不起作用,因为它不会让我更改列的值,因为它是来自 df 的切片的副本,但是您明白了。
这会非常慢,我有 1000 万行,而且需要很长时间。
我对 python 很陌生,无法想出一个快速的等价物。有什么办法可以在这里使用 lambda 函数吗?
任何帮助,将不胜感激。
谢谢!
如果我正确理解您想要做什么,以下应该有效:
rolled_values = df.groupby('user')['value'].rolling(2).mean().reset_index()
这将返回一个按用户分组的 DataFrame,“level_1”列包含旧索引,“value”列现在包含滚动平均值。
user level_1 value
0 1 0 NaN
1 1 5 2.5
2 1 6 2.0
3 1 14 2.0
4 1 16 2.0
5 1 18 2.0
6 1 19 2.5
7 2 1 NaN
8 2 3 4.0
9 2 4 4.5
(...)
现在您只需将此列添加到旧的 DataFrame 中:
df['rolled_values'] = rolled_values.set_index('level_1')['value']
user value rolled_values
0 1 3 NaN
1 2 1 NaN
2 3 5 NaN
3 2 7 4.0
4 2 2 4.5
(...)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句