кросс-таблица в Pandas DataFrame - PullRequest
0 голосов
/ 19 ноября 2018

Я создал DataFrame

    A1  A2  A3  A4
0   cccc    xx  6   5
1   aaaa    yy  8   0
2   aaaa    xx  15  0
3   bbbb    xx  21  4
4   bbbb    xx  26  0
5   cccc    yy  33  2
6   aaaa    xx  44  1
7   cccc    xx  48  2
8   aaaa    yy  58  0
9   cccc    yy  59  5
10  bbbb    yy  77  0
11  bbbb    yy  99  0

и теперь, используя crosstab() с приведенной ниже командой, я создал новый DataFrame.

df5 = pd.crosstab(df4['A1'], df4['A2'], margins=False,values=df4['A3'] , 
                 dropna=False, aggfunc='mean').reset_index().fillna(0)

это работает правильно.это дает мне вывод следующим образом

A2   A1      xx      yy
0   aaaa    29.5    33.0
1   bbbb    23.5    88.0
2   cccc    27.0    46.0

Теперь я хочу сохранить средние значения в DataFrame df4

Как я могу это сделать, поскольку я хочу изменить A3, которыйсодержать 0 в df5 на основе crosstab()?и я хочу вывод следующим образом

    A1      A2  A3  A4    
0   aaaa    xx  15  29.5    
1   aaaa    xx  44  1.0    
2   aaaa    yy  8   33.0    
3   aaaa    yy  58  33.0    
4   bbbb    xx  21  4.0    
5   bbbb    xx  26  23.5    
6   bbbb    yy  77  88.0    
7   bbbb    yy  99  88.0    
8   cccc    xx  6   5.0    
9   cccc    xx  48  2.0

1 Ответ

0 голосов
/ 19 ноября 2018

mask + groupby + transform

Игнорируя ненужное переупорядочение и удаление некоторых строк в желаемом выводе, вы можете использовать mask с groupby:

group_mean = df4.groupby(['A1', 'A2'])['A3'].transform('mean')

df4['A4'] = df4['A4'].mask(df4['A4'] == 0, group_mean)

print(df4)

      A1  A2  A3    A4
0   cccc  xx   6   5.0
1   aaaa  yy   8  33.0
2   aaaa  xx  15  29.5
3   bbbb  xx  21   4.0
4   bbbb  xx  26  23.5
5   cccc  yy  33   2.0
6   aaaa  xx  44   1.0
7   cccc  xx  48   2.0
8   aaaa  yy  58  33.0
9   cccc  yy  59   5.0
10  bbbb  yy  77  88.0
11  bbbb  yy  99  88.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...