繁体   English   中英

在python中计算每个用户的平均值

[英]calculate the average of each user in python

我有一个包含以下列的数据框 (df):用户、值和时间。

df = pd.DataFrame({'user': ['user_1', 'user_2', 'user_3','user_1', 'user_2',  'user_3',
                            'user_1', 'user_2',  'user_3'],
                   'values': [[1, 0, 2, 0], [1, 8, 0, 2],[6, 2, 0, 0],
                              [5, 0, 2, 2], [3, 8, 0, 0],[6, 0, 0, 2],
                             [3, 1, 1, 3], [2, 4, 1, 0],[4, 2, 0, 1]],
                   'time': [1, 1, 1, 2, 2, 2, 3, 3, 3]})

输出:

    user       values     time
0   user_1  [1, 0, 2, 0]    1
1   user_2  [1, 8, 0, 2]    1
2   user_3  [6, 2, 0, 0]    1
3   user_1  [5, 0, 2, 2]    2
4   user_2  [3, 8, 0, 0]    2
5   user_3  [6, 0, 0, 2]    2
6   user_1  [3, 1, 1, 3]    3
7   user_2  [2, 4, 1, 0]    3
8   user_3  [4, 2, 0, 1]    3

我想计算每个用户相对于先前时间值的平均值。

例如:

对于 user_1:-

对于 time=1,计算 user_1 在 time 1= [1, 0, 2, 0] 时的平均值

对于 time=2,计算 user_1 在时间 1 和 2 的值的平均值
= [1+5/2, 0+0/2, 2+2/2, 0+2/2]=[3, 0, 2, 1]

对于 time=3,计算 user_1 在时间 2(即 [3, 0, 2, 1])和 3(即 [3, 1, 1, 3])中的值的平均值 = [3+3/2 , 0+1/2, 2+1/2, 1+3/2]=[3, 0.5, 1.5, 2]

等等所有用户。

因此,user_1 的预期结果是:

in time 1: [1, 0, 2, 0]
in time 2: [3, 0, 2, 1]
in time 3: [3, 0.5, 1.5, 2]

我尝试了以下代码

result = (df.groupby('user')['values']
         .agg(lambda x: np.vstack(x).mean(0).round(2))
       )

print(result)

结果

user
user_1    [3.0, 0.33, 1.67, 1.67]
user_2    [2.0, 6.67, 0.33, 0.67]
user_3     [5.33, 1.33, 0.0, 1.0]

但它返回每个用户相对于所有时间的平均值,我想计算每个用户相对于当前 t 和之前 t-1 的平均值。 就像在例子中一样。

你可以用 for 循环

all = []
for x , y in  df.groupby('user'): 
    l = [np.array(y['values'].iloc[0])]
    for z in y['values'].iloc[1:] :
        m = np.array(z)
        l.append((m + l[-1])/2)
    all.append(l)
all
Out[442]: 
[[array([1, 0, 2, 0]), array([3., 0., 2., 1.]), array([3. , 0.5, 1.5, 2. ])],
 [array([1, 8, 0, 2]), array([2., 8., 0., 1.]), array([2. , 6. , 0.5, 0.5])],
 [array([6, 2, 0, 0]), array([6., 1., 0., 1.]), array([5. , 1.5, 0. , 1. ])]]

使用pandas.DataFrame.pivotpandas.DataFrame.explodepandas.DataFrame.expanding魔法:

df = df.pivot(index='user', columns='time', values='values').\
    pipe(lambda df: df.explode(df.columns.tolist())).convert_dtypes()\
    .expanding(axis=1).mean().round(2)\
    .reset_index().groupby('user').agg(list)

print(df)

结果是按user / time列和隐含mean计算组织的重塑数据框:

time                       1                     2                        3
user                                                                       
user_1  [1.0, 0.0, 2.0, 0.0]  [3.0, 0.0, 2.0, 1.0]  [3.0, 0.33, 1.67, 1.67]
user_2  [1.0, 8.0, 0.0, 2.0]  [2.0, 8.0, 0.0, 1.0]  [2.0, 6.67, 0.33, 0.67]
user_3  [6.0, 2.0, 0.0, 0.0]  [6.0, 1.0, 0.0, 1.0]   [5.33, 1.33, 0.0, 1.0]
 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM