Pandas 数据透视表:按特定字符串的计数聚合函数

Posted

技术标签:

【中文标题】Pandas 数据透视表:按特定字符串的计数聚合函数【英文标题】:Pandas pivot table: Aggregate function by count of a particular string 【发布时间】:2020-08-17 19:20:42 【问题描述】:

我正在尝试分析一个 DataFrame,其中包含 Date 作为索引,Name 和 Message 作为列。

df.head() 返回:

            Name           Message
Date        
2020-01-01  Tom ‎           image omitted
2020-01-01  Michael        ‎image omitted
2020-01-02  James          ‎image Happy new year you wonderfully awfully people...
2020-01-02  James          I was waiting for you ‎image
2020-01-02  James          QB whisperer ‎image

这是我试图取消初始 df 的数据透视表,其中 aggfunc 是单词存在的计数(例如图像)

df_s = df.pivot_table(values='Message',index='Date',columns='Name',aggfunc=(lambda x: x.value_counts()['image']))

理想情况下,作为示例

 Name        Tom    Michael   James
 Date                                   
 2020-01-01    1       1        0
 2020-01-02    0       0        3

例如,我使用了另一个 df.pivot_table

df_m = df.pivot_table(values='Message',index='Date',columns='Name',aggfunc=lambda x: len(x.unique()))

根据一天中的消息数量进行聚合,然后返回表格。

提前致谢

【问题讨论】:

【参考方案1】:

使用Series.str.count 获取由DataFrame.assign 添加到DataFrame 的新列的匹配值数量,然后使用sum 进行旋转:

df_m = (df.reset_index()
          .assign(count= df['Message'].str.count('image'))
          .pivot_table(index='Date', 
                       columns='Name', 
                       values='count' ,
                       aggfunc='sum', 
                       fill_value=0))
print (df_m)
Name        James  Michael  Tom
Date                           
2020-01-01      0        1    1
2020-01-02      3        0    0

【讨论】:

如果您不介意,原始 df 中的 2020-01-02 在哪里?似乎找不到它 @sammywemmy - 你是对的,所以编辑了有问题的样本以供匹配。【参考方案2】:

这是为了好玩,也是相同答案的替代方案。这只是对 Pandas 提供的不同选项的一种尝试:

      #or df1.groupby(['Date','Name']) if the index has a name
res = (df1.groupby([df1.index,df1.Name])
          .Message.agg(','.join)
          .str.count('image')
          .unstack(fill_value=0)
      )

res

Name      James   Michael   Tom ‎
Date            
2020-01-01  0       1        1
2020-01-02  3      0         0

【讨论】:

以上是关于Pandas 数据透视表:按特定字符串的计数聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 数据透视表值计数

使用 Redshift (PostgreSQL) 和计数的数据透视表

如何使用 Pandas 中的数据透视表计算标准差?

Pandas 均值数据透视表包含 NaN 值,即使在聚合之前填充了数据

Python数据分析pandas之分组统计透视表

pandas聚合和分组运算之groupby