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 数据透视表:按特定字符串的计数聚合函数的主要内容,如果未能解决你的问题,请参考以下文章
使用 Redshift (PostgreSQL) 和计数的数据透视表