【问题标题】:Python pandas - DataFrame groupby and re-constructPython pandas - DataFrame groupby 和 re-construct
【发布时间】:2017-06-05 01:57:43
【问题描述】:

我对 pandas 中的 groupby() 有疑问

如果我有一个 DataFrame "df" 喜欢

    user  day  click
0   U1    Mon  15
1   U2    Mon  7 
2   U1    Wed  15 
3   U3    Tue  21
4   U2    Tue  15
5   U2    Tue  10

当我使用 df.groupby(['user', 'day']).sum()
会是

            click  
user  day
U1    Mon   15
      Tue   NaN
      Wed   15
U2    Mon   7
      Tue   25
      Wed   NaN
U3    Mon   NaN
      Tue   21
      Wed   NaN

我怎样才能得到这样的DataFrame

day    Mon   Tue   Wed
user
U1     15    NaN   15
U2     7     25    NaN
U3     NaN   21    NaN

这意味着将一列转换为DataFrame的列名。
有什么方法可以做到吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用以天为列的数据透视函数并通过点击填充。

    df.groupby(['user', 'day']).sum().reset_index()\
      .pivot(index='user',columns='day',values='click')
    Out[388]: 
    day    Mon   Tue   Wed
    user                  
    U1    15.0   NaN  15.0
    U2     7.0  25.0   NaN
    U3     NaN  21.0   NaN
    

    或者你可以只重置二级索引,这样你就不需要在pivot函数中指定索引列了。

    df.groupby(['user', 'day']).sum().reset_index(level=1)\
    .pivot(columns='day',values='click')
    

    【讨论】:

      【解决方案2】:

      使用 unstack() 的另一种方式:

      df=df.groupby(['user', 'day']).sum().unstack('day') #unstack
      df.columns = df.columns.droplevel() # drop first level column name
      df
      

      输出:

      day  Mon  Tue  Wed
      user            
      U1   15.0 NaN  15.0
      U2   7.0  25.0 NaN
      U3   NaN  21.0 NaN
      

      【讨论】:

      • 这似乎在列索引中生成了另一个级别。
      • @Allen 你是对的,你的解决方案是更好的方法:) 赞成
      • 在我的应用程序中,我会使用 pivot()。这也是一个很好的解决方案。感谢您的帮助
      • @Tiny.D 谢谢。您的解决方案更紧凑,如果我不介意额外的索引级别,我会使用它。
      猜你喜欢
      • 2016-07-16
      • 1970-01-01
      • 2019-01-31
      • 2020-01-28
      • 2017-04-11
      • 1970-01-01
      • 2021-05-24
      • 2021-05-18
      • 2023-03-25
      相关资源
      最近更新 更多