Pandas Groupby.sum()避免重复

时间:2016-12-07 16:32:41

标签: python-3.x pandas

DF1

Check#  Date     Amount   Payment
100     12/1/16  $1,000   ($1,000)
201     12/8/16  $1,200   ($900)
201     12/8/16  $1,200   ($100)
301     12/5/16  $450     ($450)

我要做的是将任何尚未使用当前未结金额(金额 - 付款)全部支付的支票分成另一个数据框。

例如,我希望上面的df1返回:

DF2

Check #   Date      Amount
201       12/8/16   $200  

我在尝试运行Groupby.sum()时检查了一个标有New_Check(Amount + Payment)的新列,但最终我的Check 201为$ 2,400,这不是我想要的。

有什么想法吗?我正在使用Python 3。

2 个答案:

答案 0 :(得分:2)

您只需将Amount添加到组中,然后使用query保持方法链接

#create data
df = pd.DataFrame({'Check#':[100,201,201,301],
              'Date':['12-1-2016', '12-8-2016', '12-8-2016', '12-5-2-16'],
              'Amount':[1000,1200,1200,450],
              'Payment' : [-1000, -900, -100, -450]})

grouped = df.groupby(['Check#', 'Date','Amount'])

grouped.sum() \
       .reset_index() \
       .query("Amount != -Payment") \
       .assign(net = lambda x: x['Amount'] + x['Payment'])

输出

   Check#       Date  Amount  Payment  net
1     201  12-8-2016    1200    -1000  200

答案 1 :(得分:1)

首先获取支票金额和所有付款金额:

df2 = df1.groupby('Check').agg(
    {'Date': 'first', 'Amount': 'first', 'Payment': 'sum'}
).reset_index(level=1)

然后过滤:

df2['Amount'] = df2['Amount'] + df2['Payment']
df2 = df2[df2['Amount'] > 0].drop('Payment', axis=1)