首页 > 解决方案 > 计算两个数据框中项目的增加和减少

问题描述

我有两个产品、数字和值的数据框(相同的列)。它们代表商店在两个不同月份的产品。

df1 = pd.DataFrame({'Product': ['LAPTOP', 'CELL_PHONE', 'DRONE', 'WATCH'],
                   'Number': [10, 100, 50, 20],
                   'Value': [1000, 5000, 3000, 1000]})

df2 = pd.DataFrame({'Product': ['LAPTOP', 'DRONE', 'WATCH', 'IPHONE'],
                    'Number': [30, 50, 15, 150],
                    'Value': [2700, 3000, 750, 6000]})

df1 是上个月的数据,df2 是当月的数据。我想找出库存中的差异。理想的输出必须是 3 个数据帧,如下所示:

diff_df:

Product Number  Value
LAPTOP  +20     +1700
WATCH   -5      -250

New_Products_df:

Product     Number  Value
IPHONE      150     6000

    

停产_products_df:

Product     Number  Value
CELL_PHONE  100     5000

这是我到目前为止所做的(最小):

merged_df = df1.merge(df2, indicator=True, how='outer')
print("\n")
print(merged_df)

并且,它给出了以下结果。我必须以某种方式匹配 left_only 和 right_only 行并获得差异。也许,我正在以一种迂回的方式来做这件事。有没有更清洁的方法来做我需要做的事情?

      Product  Number  Value      _merge
0      LAPTOP      10   1000   left_only
1  CELL_PHONE     100   5000   left_only
2       DRONE      50   3000        both
3       WATCH      20   1000   left_only
4      LAPTOP      30   2700  right_only
5       WATCH      15    750  right_only
6      IPHONE     150   6000  right_only

标签: pythonpandasdataframe

解决方案


merge我们需要将 df 按唯一计数 ( nunique) 和indicator

merged_df = df1.merge(df2, indicator=True, how='outer')
x=merged_df.groupby('Product')['_merge'].agg(['nunique','first'])
merged_df=merged_df.drop('_merge',1)
diff_df=merged_df[merged_df.Product.isin(x.index[x['nunique']!=1])].groupby('Product').agg(lambda x : x.iloc[0]-x.iloc[-1])
New_Products_df=merged_df[merged_df.Product.isin(x.index[(x['nunique']==1)&x['first'].eq('right_only')])]
discontinued_products_df=merged_df[merged_df.Product.isin(x.index[(x['nunique']==1)&x['first'].eq('left_only')])]

推荐阅读