python - 计算两个数据框中项目的增加和减少
问题描述
我有两个产品、数字和值的数据框(相同的列)。它们代表商店在两个不同月份的产品。
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
解决方案
在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')])]
推荐阅读
- python - 从没有唯一 ID 的每个类别中选择 DF 的顶部行
- javascript - 在 ChartJS 函数中使用 php 变量时出现表达式预期错误
- python - 用这些噪声参数填充 2d numpy 数组的更快方法?当前循环遍历每个元素
- c# - C#和PHP之间的对称加密
- vba - 目标表中不存在字段
- xml - 删除 XSLT 中的元素?
- .net - VSCode 本地 nuget 存储库\源
- python - 训练临床 EHR pytorch 模型时出现未定义错误
- r - 用多个变量和 id 列扩大数据框
- docusignapi - DocuSign - .Net Core - JWT 用户令牌错误同意_必需