然后Pandas groupby dataframe返回单值结果(sum,total)

时间:2018-06-12 17:38:12

标签: python-3.x pandas numpy

逗人,

请帮助我,我被困了。我想这应该不难,但我感到不知所措。

需要对应收账款进行老化,因此必须将它们分成不同的桶。

假设我们只有3个组:当前以上_ 10天以上_ 20天以及下表:

d = {'Cust': [Dfg, Ers, Dac, Vds, Mhf, Kld, Xsd, Hun], 
'Amount': [10000, 100000, 4000, 5411, 756000, 524058, 4444785, 54788,
'Days': 150, 21, 30, 231, 48, 15, -4, -14 }

enter image description here

我需要将金额分组为总金额,具体取决于Aging组。 例: 当前:4499573等。

为此目的,我试图用这样的代码对应收款进行分组:

 above_10Days = df.groupby((df['Days'] > 0) & (df['Days'] <= 10))
 above10sum = above_10Days.Amount.sum().iloc[1]

它完美但只有当它们是这个组中的实际数量时才有效。 当它们不是这样的A / R时,它会抛出异常并停止执行。我尝试使用功能或制作“无”#39;值为0,但没有成功。

希望有人能够知道解决方案。

提前致谢

1 个答案:

答案 0 :(得分:0)

IIUC:

d = {'Cust': ['Dfg', 'Ers', 'Dac', 'Vds', 'Mhf', 'Kld', 'Xsd', 'Hun'], 
'Amount': [10000, 100000, 4000, 5411, 756000, 524058, 4444785, 54788],
'Days': [150, 21, 30, 231, 48, 15, -4, -14] }

df = pd.DataFrame(d)

#Updated to assign to output dataframe
df_out = (df.groupby(pd.cut(df.Days,
                  [-np.inf,10,20,np.inf],
                  labels=['Current','Above 10 Days','Above 20 Days']))['Amount']
  .sum())

输出:

Days
Current          4499573
Above 10 Days     524058
Above 20 Days     875411
Name: Amount, dtype: int64

使用.loc的可变受让人:

varCurrent = df_out.loc['Current']
var10 = df_out.loc['Above 10 Days']
var20 = df_out.loc['Above 20 Days']
print(varCurrent,var10,var20)

输出:

4499573 524058 875411