【问题标题】:Pandas explode column into rows熊猫将列爆炸成行
【发布时间】:2018-08-03 17:42:19
【问题描述】:

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

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果您的最终结果是虚拟列,则使用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
    

    【讨论】:

    • 实际上,您需要df.set_index('date').mentions.str.get_dummies(', ').resample('D').sum() 来获取缺失的日期。 OP 可能会询问其间的所有日期。
    • 谢谢先生。太好了。
    【解决方案2】:

    来自 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
    

    借用 Zero 的 resample('D')

    pd.DataFrame(mlb.fit_transform(df['mentions'].str.split(',')),columns=mlb.classes_, index=df.date).sum(level=0).resample('D')
    

    【讨论】:

      猜你喜欢
      • 2019-01-15
      • 1970-01-01
      • 2022-01-06
      • 2018-06-20
      • 2021-04-06
      • 2022-01-27
      • 2019-12-20
      • 1970-01-01
      相关资源
      最近更新 更多