将数据从一个表到另一个按ID和Date分组

时间:2019-11-20 05:51:48

标签: python pandas dataframe matrix metadata

我有一个看起来像这样的数据框:

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,不存在数据。

1 个答案:

答案 0 :(得分:0)

想法是df2DataFrame.explode(大熊猫0.25+)行,该行被拆分的Output列,因此DataFrame.merge可以左连接,然后乘以-1所有销售行,没有每个组的第一个,DataFrame.duplicated,最后一个由joinsum汇总:

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