我有一个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 |
但是我也不知道该怎么做。 就像您可能看到的那样,我不太在乎索引。
谢谢您的帮助!
答案 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