【问题标题】:How to Create a new data frame column based upon GroupyBy Object?如何基于 GroupyBy 对象创建新的数据框列?
【发布时间】:2021-05-23 19:32:53
【问题描述】:
df=pd.DataFrame({'Name':['a','a','b','b','b','c'], 'Score':[4,6,8,12,34,66]})

给出 df

我想按如下方式获取我的数据框:

我已经尝试过使用 groupie

df.groupby('Name')

这当然给了我一个 groupby 对象。我想我需要对 groupby 对象的每一组进行某种旋转?

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    你可以使用:

    df['Column'] = 'Score' + df.groupby('Name').cumcount().astype(str)
    
    (df.pivot(index='Name', columns='Column', values='Score')
       .reset_index()
       .rename_axis(columns=None)
       .rename(columns={"Score0": "Score"})
    )
    

    输出:

      Name  Score  Score1  Score2
    0    a    4.0     6.0     NaN
    1    b    8.0    12.0    34.0
    2    c   66.0     NaN     NaN
    

    【讨论】:

    • 这很完美,而且非常 Pythonic(我认为)。名为“列”的新列消失在哪里?为什么需要 cumcount?
    • @Prolle 'Column' 在成为新表的列名时消失(参数columns='Column' 指示Pandas 将其值用作列名)。 cumcount()用于为每组同名生成序列号0、1、2。用作新列名后缀Score1、Score2、Score3等('Score0'特意替换为'Score')。
    • 啊,你很会解释。非常感谢
    • @Prolle 很高兴为您提供帮助! :-)
    【解决方案2】:
    x = df.groupby("Name").agg(list)
    print(
        x["Score"]
        .apply(pd.Series)
        .add_prefix("Score")
        .fillna("")
        .rename(columns={"Score0": "Score"})
        .reset_index()
    )
    

    打印:

      Name  Score Score1 Score2
    0    a    4.0    6.0       
    1    b    8.0   12.0   34.0
    2    c   66.0              
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多