我有这两个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
的值
答案 0 :(得分:2)
通常,这似乎很困难,因为您的DataFrame形状怪异。如果您首先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