【问题标题】:Pandas groupby with new column for each valuePandas groupby,每个值都有新列
【发布时间】:2019-04-07 12:14:45
【问题描述】:

我希望标题不言自明;我想补充一点,可以假设每个键具有相同数量的值。 在线搜索标题得到以下解决方案:

Split pandas dataframe based on groupby

这应该可以解决我的问题,尽管它没有。 我举个例子:

输入:

pd.DataFrame(data={'a':['foo','foo','foo','bar','bar','bar'],'b':[1,2,3,4,5,6]})

输出:

pd.DataFrame(data={'a':['foo','bar'],'b':[1,4],'c':[2,5],'d':[3,6]})

直观地说,它是一个没有聚合函数的groupby 函数,或者是一个从键中生成列表的聚合函数。

显然,它可以使用 for 循环等“手动”完成,但在大型数据集上使用 for 循环在计算上非常昂贵。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    GroupBy.cumcount 用于Series 或列g,然后通过DataFrame.set_index + Series.unstackDataFrame.pivot 进行整形,最后通过DataFrame.add_prefixDataFrame.rename_axis 进行数据清理 DataFrame.reset_index:

    g = df1.groupby('a').cumcount()
    df = (df1.set_index(['a', g])['b']
             .unstack()
             .add_prefix('new_')
             .reset_index()
             .rename_axis(None, axis=1))
    print (df)
         a  new_0  new_1  new_2
    0  bar      4      5      6
    1  foo      1      2      3
    

    或者:

    df1['g'] = df1.groupby('a').cumcount()
    df = df1.pivot('a','g','b').add_prefix('new_').reset_index().rename_axis(None, axis=1)
    print (df)
         a  new_0  new_1  new_2
    0  bar      4      5      6
    1  foo      1      2      3
    

    【讨论】:

    • 非常感谢。这绝对解决了这个问题,只是它引发了另一个尝试对每一行进行排序的问题:“df_db[relevant_cols]=df_db[relevant_cols].apply(np.sort,axis=1)” 引发:ValueError: cannot label index with a null key I尝试再次重置索引,没有工作。有什么想法吗?
    • @user9548409 - 一个想法 - 之前可以排序吗?喜欢df = df.sort_values('b') 然后应用我的解决方案?
    • 对不起,不,我将在 groupby 之后有一些空值,我需要用它们填充 0,然后才排序.. 排序之前会弄乱顺序。如果重要的话,我使用了第一种方法(不是枢轴函数)。再次感谢
    • @user9548409 - 好的,然后使用df_db[relevant_cols] = np.sort(df_db[relevant_cols], axis=1)
    • @user9548409 - 使用df_db = pd.DataFrame({ 'A':list('abcdef'), 'B':[4,5,4,5,5,4], 'C':[7,8,9,4,2,3], 'D':[1,3,5,7,1,0], 'E':[5,3,6,9,2,4], 'F':list('aaabbb') }) print (df_db) relevant_cols = ['B','C','E'] df_db[relevant_cols] = np.sort(df_db[relevant_cols], axis=1) print (df_db) 测试
    【解决方案2】:

    这是一种替代方法,如果列名很重要,则使用 groupby.applystring.ascii_lowercase

    from string import ascii_lowercase
    
    df = pd.DataFrame(data={'a':['foo','foo','foo','bar','bar','bar'],'b':[1,2,3,4,5,6]})
    
    # Groupby 'a'
    g = df.groupby('a')['b'].apply(list)
    
    # Construct new DataFrame from g
    new_df = pd.DataFrame(g.values.tolist(), index=g.index).reset_index()
    
    # Fix column names
    new_df.columns = [x for x in ascii_lowercase[:new_df.shape[1]]]
    
    print(new_df)
    
         a  b  c  d
    0  bar  4  5  6
    1  foo  1  2  3
    

    【讨论】:

    • 谢谢,它也有效。我首先使用了其他评论的方法,但是在遇到排序问题(“ValueError:无法使用空键标记索引”)之后,我也尝试了这个方法,它引发了同样的错误。帮助将不胜感激解决这个问题。到目前为止,谷歌搜索没有帮助。
    猜你喜欢
    • 2019-07-07
    • 2018-08-20
    • 2018-05-22
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多