【问题标题】:Pandas Groupby: Count and mean combinedPandas Groupby:计数和平均值相结合
【发布时间】: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()

但只给出每个来源,而且很平均,没有列标题。

【问题讨论】:

    标签: python python-2.7 pandas dataframe group-by


    【解决方案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】:

            您可以将groupbyaggregate 一起使用:

            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())
            • 我的数据集中有几个变量我想要一个平均值,我只想要我分组的变量的计数。有没有办法做到这一点?
            猜你喜欢
            • 2017-08-05
            • 2021-10-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-08
            • 2019-12-30
            • 1970-01-01
            • 2022-08-17
            相关资源
            最近更新 更多