我有一个数据库,在两个城市之间有转移订单。我在每张记录中都有一个出发日期,交付金额,退货日期和退货金额。
数据库是这样的:
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来实现这一目标?如果不可能,有人能告诉我最好的方法吗?
提前致谢
答案 0 :(得分:3)
您需要执行两次groupby
+ sum
次操作,然后才需要reindex
和concat
次级操作 -
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