Pandas Pivot表总和基于其他列(好像有两个索引)

时间:2018-03-19 13:38:52

标签: python pandas

我有一个数据库,在两个城市之间有转移订单。我在每张记录中都有一个出发日期,交付金额,退货日期和退货金额。

数据库是这样的:

df = pd.DataFrame({"dep_date":[201701,201701,201702,201703], "del_amount":[100,200,300,400],"ret_date":[201703,201702,201703,201705], "ret_amount":[50,75,150,175]})

df
   dep_date  del_amount  ret_date  ret_amount
0    201701        100    201703         50
1    201701        200    201702         75
2    201702        300    201703        150
3    201703        400    201705        175

我想获得一个带有dep_data作为索引的数据透视表,显示该月份的del_amount和在同一个月的出发日期安排的返回金额。

这是一个奇怪的结构,因为它似乎有两个索引。我需要的结果是:

          del_amount  ret_amount
dep_date                      
201701          300          0
201702          300         75
201703          400        200

请注意,某些退货日期与任何出发月份不匹配。有谁知道是否有可能在pivot_table环境中建立一个合适的aggfunc来实现这一目标?如果不可能,有人能告诉我最好的方法吗?

提前致谢

3 个答案:

答案 0 :(得分:3)

您需要执行两次groupby + sum次操作,然后才需要reindexconcat次级操作 -

i = df.groupby(df.dep_date % 100)['del_amount'].sum()
j = df.groupby(df.ret_date % 100)['ret_amount'].sum()

pd.concat([i, j.reindex(i.index, fill_value=0)], 1)

          del_amount  ret_amount
dep_date                        
1                300           0
2                300          75
3                400         200

如果您想对整个日期(而不仅仅是月份编号)进行分组,请将df.groupby(df.dep_date % 100)更改为df.groupby('dep_date')

答案 1 :(得分:3)

使用

In [97]: s1 = df.groupby('dep_date')['del_amount'].sum()

In [98]: s2 = df.groupby('ret_date')['ret_amount'].sum()

In [99]: s1.to_frame().join(s2.rename_axis('dep_date')).fillna(0)
Out[99]:
          del_amount  ret_amount
dep_date
201701           300         0.0
201702           300        75.0
201703           400       200.0

答案 2 :(得分:3)

将它分成两个df,然后我们计算每一个,然后我们加入

s=df.loc[:,df.columns.str.startswith('de')]
v=df.loc[:,df.columns.str.startswith('ret')]

s.set_index('dep_date').sum(level=0).join(v.set_index('ret_date').sum(level=0)).fillna(0)
Out[449]: 
          del_amount  ret_amount
dep_date                        
201701           300         0.0
201702           300        75.0
201703           400       200.0