Как сгруппировать по значению датафрейма? - PullRequest
2 голосов
/ 29 марта 2019

У меня есть эти 2 df, которые в основном совпадают, но в df1 значения представляют собой сумму платежа соответствующего клиента, а другой - статус клиента за этот период (столбцы 1,2,3,4 периоды):

df1:

customer|1|2|3|4
x       |2|5|5|5
y       | |5|5|5
z       |5|5|5|

df2:

customer|1|2|3|4
x       |N|E|E|E
y       | |N|E|E
z       |N|E|C|-

Я хочу сгруппировать по состоянию, в котором значения df2 будут такими:

Status  1 |2 |3 |4
N        7|5 |  |
E         |10|10|10
C         |  |5 |

Я использовал для группировки счетчика состояния, используя

df2.apply(pd.value_counts).fillna(0)

но теперь вместо count значений я хочу SUM значение соответствующего фрейма данных DF1

1 Ответ

2 голосов
/ 29 марта 2019

Как часто, это кажется трудным, потому что у вас есть свои DataFrames в странной форме. Если вы сначала melt их, это становится легко: просто merge их, groupby ваших количествах процентов и суммируйте их (и pivot еще раз, если вы хотите отобразить его в этом формате):

df1m = df1.melt(id_vars='customer', var_name='period', value_name='amount')
df2m = df2.melt(id_vars='customer', var_name='period', value_name='status')
dfm = df1m.merge(df2m)
res = dfm.groupby(['status', 'period'])['amount'].sum().reset_index()
res.pivot_table(index='status', columns='period')

#period      1     2     3     4
#status                         
#C         NaN   NaN   5.0   NaN
#E         NaN  10.0  10.0  10.0
#N         7.0   5.0   NaN   NaN

Чтобы показать, что делает расплавление: он разворачивает DataFrame, поэтому у вас есть одна строка на наблюдение (клиент, период), которая имеет сумму / статус

df1m
#    customer period  amount
#0   x             1     2.0
#1   y             1     NaN
#2   z             1     5.0
#3   x             2     5.0
#4   y             2     5.0
#5   z             2     5.0
#6   x             3     5.0
#7   y             3     5.0
#8   z             3     5.0
#9   x             4     5.0
#10  y             4     5.0
11  z             4     NaN
...