【问题标题】:Pivoting with grouby?与 group by 旋转?
【发布时间】:2021-08-05 06:14:57
【问题描述】:

我想知道您是否可以帮我找到以下问题的解决方案。给定一个像这样的数据框 df1

d1={'L':['aaa','bbb','ccc','aaa','bbb','ddd'],
'w':[1,5,9,13,17,21],
'x':[2,6,10,14,18,22],
'y':[3,7,11,15,19,23],
'z':[4,8,12,16,20,24]}
df1=pd.DataFrame(d1)

和两个字典来定义对列和行的分组

dctRowGroups={'aaa':'A','bbb':'B','ccc':'A','ddd':'B'}
dctColGroups={'w':'ALPHA','x':'BETA','y':'ALPHA','z':'BETA'}

作为第一步,我想对列进行聚合。申请中

g2=df1.groupby(dctColGroups,axis=1)
g2.sum()

结果

但我想为下一步按行聚合保留“L”列,即结果应该是更像这样的数据帧 df2:

我需要编写什么代码才能做到这一点? 作为下一步,我想使用 dctRowGroups 字典在行上聚合 df2

g3=df2.groupby(dctRowGroups,axis=0)
g3.sum()

得到这样的最终结果:

我怎样才能用尽可能少的代码行完成所有这些步骤? 感谢您对此的建议。

非常感谢

威尔弗里德。

【问题讨论】:

    标签: pandas dataframe group-by pivot aggregation


    【解决方案1】:

    你可以这样做:

    首先创建df2并使用insert()方法插入'L'列:

    df2=df1.groupby(dctColGroups,axis=1).sum()
    
    df2.insert(0,'L',df1['L'])  #use this only when the order matters
    
    #OR(use anyone of the method either insert or assign)
    
    df2=df2.assign(L=df1['L'])  #otherwise use this
    

    最后使用assign(),map()groupby()方法:

    result=df2.assign(L=df2['L'].map(dctRowGroups)).groupby('L').sum()
    

    输出:

    df2:

        L   ALPHA   BETA
    0   aaa     4   6
    1   bbb     12  14
    2   ccc     20  22
    3   aaa     28  30
    4   bbb     36  38
    5   ddd     44  46
    

    result:

        ALPHA   BETA
    L       
    A   52      58
    B   92      98
    

    【讨论】:

    • 感谢您的回答。有用!我想更好地理解的是为什么在第二步中一个简单的“result=df2.groupby(dctRowGroups,axis=0)”确实提供了与“result=df2.assign(L=df2['L'] .map(dctRowGroups)).groupby('L').sum()"?
    • 如果这个答案解决了您的问题,那么请尝试考虑接受这个答案...Thnx :)
    • 在我这边 result=df2.groupby(dctRowGroups,axis=0) 这会引发错误,所以我使用了 result=df2.assign(L=df2['L'].map(dctRowGroups)).groupby('L').sum()
    • 啊,好的。我将 result=df2.assign(L=df2['L'].map(dctRowGroups)).groupby('L').sum() 分解为单独的步骤,以更好地了解发生了什么。现在很清楚:需要用 dctRowGroups 中的新标签替换“L”列中的旧标签,将其作为“L”列重新插入 DataFrame,然后应用 groupby('L').sum()到那个新的 DataFrame。
    • yes.....df2['L'].map(dctRowGroups) 这会将dctRowGroups 内的'L' 列替换为其值(基本上称为映射)和assign() 方法即:df2.assign(L=df2['L'].map(dctRowGroups)) 将将这些映射值分配给列'L' 然后我们按列'L' 即:groupby('L') 并通过sum() 方法计算总和
    猜你喜欢
    • 2018-01-28
    • 2014-11-22
    • 2018-04-11
    • 2010-09-30
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多