Pandas将列爆炸成行

时间:2018-02-23 15:55:21

标签: python pandas

我有一个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

我已经在其他地方看到了这个问题的变化,但不太像我的,我觉得很简单,我只是没有看到正确的解决方案。

2 个答案:

答案 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

@Zero

所述
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')