我有一个看起来像这样的数据框:
ID Date Item Sales
1 1-Dec A 10
1 2-Dec B 15
1 3-Dec C 20
2 1-Dec A 20
2 2-Dec C 10
3 1-Dec A 5
3 2-Dec A 15
还有另一个看起来像这样的表:
ID Date Input Output
1 1-Dec A A,B
2 2-Dec A A,B,C
3 3-Dec B B,C
现在基于ID和日期,我必须从表1中选择销售额,无论输入与输出不相等,它都应计算两次销售额之间的总和,因此输出表将如下所示:
ID Date Input Output Diff.
1 1-Dec A A,B 10-0=10
2 2-Dec A A,B,C 0-0-10=-10
3 3-Dec B B,C 0-0=0
第1行的输出为10,因为在销售表中,A在12月1日的销售量和ID 1为10,而B的数据不可用,因此可以将其视为0。 在第2行中,输出为-10,因为对于Dec-2和输出2,未给出B和C的销售额 同样,对于第3行,输出为0,因为对于B和C,不存在数据。
答案 0 :(得分:0)
想法是df2
中DataFrame.explode
(大熊猫0.25+)行,该行被拆分的Output
列,因此DataFrame.merge
可以左连接,然后乘以-1
所有销售行,没有每个组的第一个,DataFrame.duplicated
,最后一个由join
和sum
汇总:
df2 = df2.assign(Output = df2['Output'].str.split(',')).explode('Output')
df = (df2.merge(df1.rename(columns={'Item':'Output'}),
how='left',
on=['ID','Date','Output'])
.fillna({'Sales':0}))
df.loc[df.duplicated(subset=['ID','Date','Input']), 'Sales'] *= -1
df = (df.groupby(['ID','Date','Input'], as_index=False)
.agg({'Output':','.join, 'Sales':'sum'})
.rename(columns={'Sales':'Diff'}))
print (df)
ID Date Input Output Diff
0 1 1-Dec A A,B 10.0
1 2 2-Dec A A,B,C -10.0
2 3 3-Dec B B,C 0.0