Pandas Groupby, используя несколько критериев на разных осях - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть 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 голосов
/ 12 ноября 2018

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
0 голосов
/ 12 ноября 2018

Просто 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
0 голосов
/ 12 ноября 2018

Вы можете сначала изменить форму на melt, удалив _ из имен столбцов (для лучшей производительности, потому что strip только несколько значений) с pivot_table:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...