在 pandas 中按照 groupby 执行计算?
Performing computation following groupby in pandas?
我有以下四列数据框(我已经简化了它,而且它也更长)。用户权重始终为一个,因此他们的响应被平等对待。尽管在此示例中为每个 post 分配了相同的三个用户,但实际上用户是随机分配给 post 的,并且每个 post 都分配了数量可变的用户。
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 分组后如下所示。平均响应只是按 post 对用户的响应进行平均(因此,如果 0 表示错误,1 表示正确,那么这基本上可以衡量用户声称 post 的真假程度)。第二列表示一致(所以 1 是完全一致,分数越高越好)。
Post Avg_Response Agreement
----- ------------ ---------
text1 0.33 0.66
text2 0.66 0.66
我对如何计算平均响应(使用均值函数)有信心,但我不确定如何计算一致性(最后一列使用 pandas。我确信有一些简单的在两行之一中执行此操作的技巧。我的猜测是计算每个 post 的 0 和 1 的数量除以该划分的响应总数。然后我们将采用更大的比率。如果他们是平等的,然后我们摆脱他们(所以我们不想要任何 post 用户被平均分配的)。
非常感谢有关代码的帮助!谢谢。
这是一种方法:
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
我有以下四列数据框(我已经简化了它,而且它也更长)。用户权重始终为一个,因此他们的响应被平等对待。尽管在此示例中为每个 post 分配了相同的三个用户,但实际上用户是随机分配给 post 的,并且每个 post 都分配了数量可变的用户。
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 分组后如下所示。平均响应只是按 post 对用户的响应进行平均(因此,如果 0 表示错误,1 表示正确,那么这基本上可以衡量用户声称 post 的真假程度)。第二列表示一致(所以 1 是完全一致,分数越高越好)。
Post Avg_Response Agreement
----- ------------ ---------
text1 0.33 0.66
text2 0.66 0.66
我对如何计算平均响应(使用均值函数)有信心,但我不确定如何计算一致性(最后一列使用 pandas。我确信有一些简单的在两行之一中执行此操作的技巧。我的猜测是计算每个 post 的 0 和 1 的数量除以该划分的响应总数。然后我们将采用更大的比率。如果他们是平等的,然后我们摆脱他们(所以我们不想要任何 post 用户被平均分配的)。
非常感谢有关代码的帮助!谢谢。
这是一种方法:
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