我有一个DataFrame,每行有两列:date和mentions。最终结果将是每个日期提及的数据帧,如果我可以突破提及,这是我被困的地方,这应该很容易通过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
我已经在其他地方看到了这个问题的变化,但不太像我的,我觉得很简单,我只是没有看到正确的解决方案。
答案 0 :(得分:6)
如果您的最终结果是虚拟列,请使用pd.Series.str.get_dummies
df.set_index('date').mentions.str.get_dummies(', ').sum(level=0)
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
所述
df.set_index('date').mentions.str.get_dummies(', ').resample('D').sum()
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-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 0 1
答案 1 :(得分:1)
来自sklearn
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
pd.DataFrame(mlb.fit_transform(df['mentions'].str.split(',')),columns=mlb.classes_, index=df.date).sum(level=0)
Out[1745]:
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
Borrow Zero的重新采样('D')
pd.DataFrame(mlb.fit_transform(df['mentions'].str.split(',')),columns=mlb.classes_, index=df.date).sum(level=0).resample('D')