Pandas Groupby:计数和平均值相结合
Posted
技术标签:
【中文标题】Pandas Groupby:计数和平均值相结合【英文标题】:Pandas Groupby: Count and mean combined 【发布时间】:2017-04-23 17:38:01 【问题描述】:与 pandas 一起尝试将数据框总结为某些类别的计数,以及这些类别的平均情绪得分。
有一个表格,其中包含不同情绪分数的字符串,我想通过说明每个文本源有多少帖子以及这些帖子的平均情绪来对每个文本源进行分组。
我的(简化的)数据框如下所示:
source text sent
--------------------------------
bar some string 0.13
foo alt string -0.8
bar another str 0.7
foo some text -0.2
foo more text -0.5
这个输出应该是这样的:
source count mean_sent
-----------------------------
foo 3 -0.5
bar 2 0.415
答案大致如下:
df['sent'].groupby(df['source']).mean()
但只给出每个来源,而且很平均,没有列标题。
【问题讨论】:
【参考方案1】:对于那些正在寻找超过两列的聚合的人(就像我一样):只需将它们添加到 'agg'。
df = df.groupby(['id']).agg('texts': 'size', 'char_num': 'mean', 'bytes': 'mean').reset_index()
【讨论】:
【参考方案2】:下面的应该可以正常工作:
df[['source','sent']].groupby('source').agg(['count','mean'])
【讨论】:
【参考方案3】:实现此目的的较短版本是:
df.groupby('source')['sent'].agg(count='size', mean_sent='mean').reset_index()
这样做的好处是,如果你想取多个变量的平均值但只计算一次,你可以扩展它。在这种情况下,您将不得不传递一个字典:
df.groupby('source')['sent1', 'sent2'].agg('count': 'size', 'means': 'mean').reset_index()
【讨论】:
【参考方案4】:在较新版本的 Panda 中,您不再需要重命名,只需使用命名参数即可:
df = df.groupby('source') \
.agg(count=('text', 'size'), mean_sent=('sent', 'mean')) \
.reset_index()
print (df)
source count mean_sent
0 bar 2 0.415
1 foo 3 -0.500
【讨论】:
我的数据集中有几个变量我想要一个平均值,我只想要我分组的变量的计数。有没有办法做到这一点? @JyothsnaHarithsa 您可能需要构建一个键字典:(元组)并使用 **kdict 传递它。如果您这样做两次,您的代码可能会更清晰。【参考方案5】:我认为这应该提供您想要的输出:
result = pd.DataFrame(df.groupby('source').size())
results['mean_score'] = df.groupby('source').sent.mean()
【讨论】:
【参考方案6】:您可以将groupby
与aggregate
一起使用:
df = df.groupby('source') \
.agg('text':'size', 'sent':'mean') \
.rename(columns='text':'count','sent':'mean_sent') \
.reset_index()
print (df)
source count mean_sent
0 bar 2 0.415
1 foo 3 -0.500
【讨论】:
很好的答案。如果你想计算同一列的计数和平均值,你会怎么做?因为如果你两次传入列名,你会得到一个重复的键错误。 @Yu Chen 确定,使用df1 = (df.groupby('source')['your column'] .agg(('count', 'size') , ('avg', 'mean')) .reset_index())
我的数据集中有几个变量我想要一个平均值,我只想要我分组的变量的计数。有没有办法做到这一点?以上是关于Pandas Groupby:计数和平均值相结合的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:将重采样与 groupby 相结合并计算时间差