Python - отображение суммы группы на другой фрейм данных - PullRequest
0 голосов
/ 06 января 2019

Мой фрейм данных A:

id   groupA    groupB    groupC    groupD   groupE    ...
001    0         0         0         0        0
002    0         0         0         0        0
003    0         0         0         0        0
  ...

кадр данных B:

id     value     count
001    groupA      2
002    groupB      1
001    groupB      3
001    groupC      1
003    groupC      2
002    groupA      1


dfB.groupby(['id', 'value'])['count'].sum()

Запустив эту группу, я получаю:

id  value 
1   groupA    2
    groupB    3
    groupC    1
2   groupA    1
    groupB    1
3   groupC    2
Name: count, dtype: int64

Я пытался преобразовать этот результат в фрейм данных и отобразить его обратно в фрейм данных А, но это не сработало.

Мой идеальный дата-фрейм Aoutput:

id   groupA    groupB    groupC    groupD   groupE    ...
001    2         3         1         0        0
002    1         1         0         0        0
003    0         0         2         0        0
  ...

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Вы можете также использовать pivot . Кажется чище

df

   id    value  count
0   1   groupA  2
1   2   groupB  1
2   1   groupB  3
3   1   groupC  1
4   3   groupC  2
5   2   groupA  1
6   3   groupA  5

aa = pd.DataFrame(df.groupby(by=["id", "value"]).sum()).reset_index().pivot(index="id", columns="value", values="count").fillna(0)
aa.columns.name = aa.index.name
aa.index.name = ""
aa

id  groupA  groupB  groupC
1   5.0 3.0 1.0
2   1.0 1.0 0.0
3   5.0 0.0 2.0
0 голосов
/ 07 января 2019

Do с однолинейной цепью с reindex

dfb.groupby(['id', 'value'])['count'].sum().\
     unstack(fill_value=0).\
       reindex(columns=dfa.columns,index=dfa.id,fill_value=0).\
        drop('id',1)
    groupA  groupB  groupC  groupD  groupE
id                                        
1        2       3       1       0       0
2        1       1       0       0       0
3        0       0       2       0       0
0 голосов
/ 06 января 2019

Вы можете повернуть df2 и объединить два кадра данных,

df2.pivot_table(index = 'id', columns = 'value', values = 'count', aggfunc='sum').reset_index()\
.merge(df1, how = 'left').fillna(0).astype(int)


    id  groupA  groupB  groupC  groupD  groupE
0   1   2       3       1       0       0
1   2   1       1       0       0       0
2   3   0       0       2       0       0

Вы можете сделать то же самое с groupby,

df2.groupby(['id', 'value'])['count'].sum().unstack().reset_index()\
.merge(df1, how = 'left').fillna(0).astype(int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...