Как объединить совокупный вывод обратно в исходный фрейм данных - PullRequest
0 голосов
/ 03 июня 2018

Итак, для обобщенных целей подхода:

df= [['A' , 'B']] (dataframe is actually bigger but for simplicity)

SC = df[['A','B']].groupby('A').agg({'B': ['mean', 'std']})

Я пытаюсь получить результат этого обратно в исходный df, поэтому вывод может быть:

df=[['A','B','mean of B','std of B']]

Iпопробовано: pd.merge(df, SC, on=None), получено сообщение об ошибке:

"MergeError: Нет общих столбцов для выполнения слияния на"

Любая помощь будет принята с благодарностью, по возможности упрощенно.

Спасибо

Ответы [ 3 ]

0 голосов
/ 03 июня 2018

групповое преобразование

Одно из решений - выполнить два groupby.transform вычисления:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0, 3, (50, 2)), columns=['A', 'B'])

df['mean'] = df.groupby('A')['B'].transform('mean')
df['std'] = df.groupby('A')['B'].transform('std')

print(df.head())

   A  B      mean       std
0  0  2  0.866667  0.915475
1  2  2  1.187500  0.910586
2  1  1  0.947368  0.911268
3  1  0  0.947368  0.911268
4  0  2  0.866667  0.915475

groupby agg + merge

В качестве альтернативы вы можете выполнить один groupby агрегация.Затем выровняйте индексы и объедините:

# grp dataframe is indexed by A
grp = df.groupby('A')['B'].agg(['mean', 'std'])

# set same index for df, perform merge on indices, then reset index
res = df.set_index('A')\
        .merge(grp, left_index=True, right_index=True)\
        .reset_index()
0 голосов
/ 03 июня 2018

Вы можете использовать describe + reindex

df.assign(**df.groupby('A').B.apply(pd.Series.describe).unstack().reindex(df.A).to_dict('l')).head()
Out[171]: 
   A  B  25%  50%  75%  count  max      mean  min       std
0  1  2  0.0  1.0  2.0   19.0  2.0  1.052632  0.0  0.911268
1  1  0  0.0  1.0  2.0   19.0  2.0  1.052632  0.0  0.911268
2  1  2  0.0  1.0  2.0   19.0  2.0  1.052632  0.0  0.911268
3  2  0  0.0  1.0  2.0   18.0  2.0  1.000000  0.0  0.840168
4  1  2  0.0  1.0  2.0   19.0  2.0  1.052632  0.0  0.911268
0 голосов
/ 03 июня 2018

Я думаю, вам просто нужно указать столбцы для объединения :

df.merge(SC, left_on = 'A', right_index=True)

Пример:

# Original Dataframe (randomly created):
>>> df
   A  B
0  b  8
1  a  8
2  a  1
3  b  9
4  b  2
5  b  9
6  b  4
7  a  9
8  a  0
9  b  8

# The result of your "SC" object created by groupby and agg
>>> SC
          B          
       mean       std
A                    
a  4.500000  4.654747
b  6.666667  2.943920

# Merge them together on the appropriate columns:
>>> df.merge(SC, left_on = 'A', right_index=True)
   A  B  (B, mean)  (B, std)
0  b  8   6.666667  2.943920
3  b  9   6.666667  2.943920
4  b  2   6.666667  2.943920
5  b  9   6.666667  2.943920
6  b  4   6.666667  2.943920
9  b  8   6.666667  2.943920
1  a  8   4.500000  4.654747
2  a  1   4.500000  4.654747
7  a  9   4.500000  4.654747
8  a  0   4.500000  4.654747

Если выхотите, вы можете получить объединенный фрейм данных в исходном порядке, просто добавив .sort_index:

df.merge(SC, left_on = 'A', right_index=True).sort_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...