我有一个 DataFrame,其中每行有两列:日期和提及。最终结果将是每个日期的提及的 Dataframe,如果我可以分解提及,通过 GroupBy 应该很容易,这就是我遇到的问题。原始数据如下所示:
date mentions 2018-01-01 alpha, beta, gamma 2018-01-01 alpha 2018-01-02 beta 2018-01-03 delta 2018-01-05 alpha 2018-01-07 alpha 2018-01-10 delta, gamma 2018-01-11 gamma
我需要将其转换为:
date mentions 2018-01-01 alpha 2018-01-01 beta 2018-01-01 gamma 2018-01-01 alpha 2018-01-02 beta 2018-01-03 delta 2018-01-05 alpha 2018-01-07 alpha 2018-01-10 delta 2018-01-10 gamma 2018-01-11 gamma
最终状态应如下所示,我可以通过 GroupBy 值计数(加上重新索引)来获得:
date alpha beta gamma delta 2018-01-01 2 1 1 0 2018-01-02 0 1 1 0 2018-01-03 0 0 0 1 2018-01-04 0 0 0 0 2018-01-05 1 0 0 0 2018-01-06 0 0 0 0 2018-01-07 1 0 0 0 2018-01-08 0 0 0 0 2018-01-09 0 0 0 0 2018-01-10 0 0 1 1 2018-01-11 0 0 1 0
我在其他地方看到过这个问题的变体,但与我的不太一样,我觉得它非常简单,我只是没有看到正确的解决方案。
你可以通过以下步骤实现你想要的结果:
mentions
GroupBy
size
下面是实现的步骤:
import pandas as pd # 原始数据 data = { 'date': ['2018-01-01', '2018-01-01', '2018-01-02', '2018-01-03', '2018-01-05', '2018-01-07', '2018-01-10', '2018-01-11'], 'mentions': ['alpha, beta, gamma', 'alpha', 'beta', 'delta', 'alpha', 'alpha', 'delta, gamma', 'gamma'] } # 创建 DataFrame df = pd.DataFrame(data) # 将 mentions 列中的字符串按逗号拆分并展开成多行 df_expanded = df.set_index('date').mentions.str.split(', ', expand=True).stack().reset_index(name='mention') # 计算每个日期的每个提及的计数 result = df_expanded.groupby(['date', 'mention']).size().unstack(fill_value=0) # 查看结果 print(result)
mention alpha beta delta gamma date 2018-01-01 2 1 0 1 2018-01-02 0 1 0 0 2018-01-03 0 0 1 0 2018-01-05 1 0 0 0 2018-01-07 1 0 0 0 2018-01-10 0 0 1 1 2018-01-11 0 0 0 1
str.split(', ')
stack()
groupby(['date', 'mention']).size()
unstack()
mention
这种方法既高效又简洁,适用于你的需求。