Pandas Groupby在不同的轴上使用多个条件

时间:2018-11-12 14:22:01

标签: python pandas pandas-groupby

我有一个df DataFrame,如:

      | A | B | A_ | B_ |COMMON|
--------------------------------
0     | 1 | 3 | 0  | 1  | a    |
--------------------------------
1     | 8 | 5 | 4  | 0  | a    |
--------------------------------
2     | 3 | 6 | 2  | 4  | b    |
--------------------------------
3     | 9 | 9 | 1  | 7  | b    |

我想对所有字母X的所有列X_A,B,...进行分组(也就是说,该组也称为X),并对其进行分组使用COMMON。我想将诸如std()之类的后续功能应用于所有分组的值。

所以结果看起来像:

COMMON  |  A     |  B     |
---------------------------
a       |std(...)|std(...)|
---------------------------
b       |std(...)|std(...)|

我已经能够使用一个条件将df.groupby(['COMMMON'])和另一个条件.groupby(mapping_function, axis=1)进行分组,但是如何将它们一起使用?

中间步骤的另一种选择是连接各个列,这样我就可以得到:

      | A | B |COMMON|
----------------------
0     | 1 | 3 |a    |
---------------------
1     | 8 | 5 |a    |
---------------------
2     | 3 | 6 |b    |
---------------------
3     | 9 | 9 |b    |
---------------------
0     | 0 | 1 |a    |
---------------------
1     | 4 | 0 |a    |
---------------------
2     | 2 | 4 |b    |
---------------------
3     | 1 | 7 |b    |

但是我也不知道该怎么做。 就像您可能看到的那样,我不太在乎索引。

谢谢您的帮助!

3 个答案:

答案 0 :(得分:8)

您可以先通过melt来重塑形状,方法是使用pivot_table从列名中删除_(以提高性能,因为strip的值很少):

df = (df.rename(columns=lambda x: x.strip('_'))
        .melt('COMMON')
        .pivot_table(index='COMMON',columns='variable', values='value', aggfunc='std'))

print (df)
variable         A         B
COMMON                      
a         3.593976  2.217356
b         3.593976  2.081666

答案 1 :(得分:5)

IIUC

df.melt('COMMON').assign(variable=lambda x : x['variable'].str.rstrip('_')).\
       groupby(['COMMON','variable']).value.std().unstack()
Out[18]: 
variable         A         B
COMMON                      
a         3.593976  2.217356
b         3.593976  2.081666

答案 2 :(得分:2)

groupby

h = lambda x: x[-1][0]

df.set_index('COMMON', append=True).stack().groupby(['COMMON', h]).std().unstack()

               A         B
COMMON                    
a       3.593976  2.217356
b       3.593976  2.081666