在Pandas中跟随groupby执行计算?

2024-03-29 09:52:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面四列的dataframe(我简化了它,它也长得多)。用户权重总是一个,因此他们的响应被平等对待。尽管在本例中,将相同的三个用户分配给每个帖子,但实际上,用户是随机分配给帖子的,并且每个帖子分配了不同数量的用户。你知道吗

Post      userid     Weight  Response
-----     --------    ------  ---------
text1      A           1        0
text2      A           1        1
text1      B           1        0
text2      C           1        1
text1      C           1        1
text2      B           1        0

在按post分组之后,我希望生成的数据帧如下所示。Average response只是按帖子平均用户的响应(因此,如果0表示false,1表示true,那么这基本上可以衡量用户声明帖子的真假)。第二列表示一致(因此1表示完全一致,分数越高越好)。你知道吗

Post      Avg_Response     Agreement
-----     ------------     ---------
text1       0.33            0.66
text2       0.66            0.66

我对如何计算平均响应(使用均值函数)很有信心,但我不确定如何计算一致性(最后一列使用pandas)。我相信有一些简单的技巧可以做到这两行之一。我的猜测是将每个帖子的0和1的数量除以该帖子的回复总数。我们将取更大的比率。如果它们相等,那么我们就把它们去掉(所以我们不希望任何用户被平均分配的帖子)。你知道吗

我将非常感谢帮助与代码!非常感谢。你知道吗


Tags: 数据用户dataframe数量responsepost帖子权重
2条回答

有一种方法:

import pandas as pd
import numpy as np
from io import StringIO

df = pd.read_fwf(StringIO("""
Post      userid     Weight  Response
text1      A           1        0
text2      A           1        1
text1      B           1        0
text2      C           1        1
text1      C           1        1
text2      B           1        0
"""), header=1)

mn = df.groupby(['Post'])['Response'].mean()
md = df.groupby(['Post'])['Response'].agg(lambda x: max(np.mean(x), 1 - np.mean(x)))

mn.name = 'Avg_Response'
md.name = 'Agreement'
df2 = pd.concat([mn, md], axis=1)
df2

屈服。。。你知道吗

       Avg_Response  Agreement
Post
text1      0.333333   0.666667
text2      0.666667   0.666667

您无需pd.concat即可完成此操作。使用__name__命名自定义函数,并将它们作为列表传递。你知道吗

def simple_mean(x):
    return x.mean()

def custom_mean(x):
    return max(x.mean(), 1-x.mean())

simple_mean.__name__ = 'Avg_Response'
custom_mean.__name__ = 'Agreement'

df.groupby('Post')['Response'].agg([simple_mean, custom_mean])

       Avg_Response  Agreement
Post
text1      0.333333   0.666667
text2      0.666667   0.666667

相关问题 更多 >