[英]Update dataframe values based on comparison with another dataframe
我有2個數據框需要比較,並根據數據框2的值更新數據框1的值。
數據框1
DU ID Part Number Qty Unit
102 00334567 1 PCS
102 00334567 2 PCS
102 RRWQTDFG 3 PCS
102 3456DDHE 4 PCS
102 DF033WW2 2 PCS
數據框2是具有唯一零件號和實際數量的列表。 數據框2
DU ID Part Number Actual Qty Unit
102 00334567 10 PCS
102 RRWQTDFG 3 PCS
102 3456DDHE 7 PCS
102 DF033WW2 0 PCS
我想用dataframe2值替換dataframe1值
如下例所示:零件號00334567在數據框1中的數量為3,但實際數量為10,因此我將需要用值9更新第二個00334567的數量以匹配數據框2中的實際數量。
輸出看起來像這樣
DU ID Part Number Actual Qty Unit
102 00334567 1 PCS
102 00334567 9 PCS
102 RRWQTDFG 3 PCS
102 3456DDHE 7 PCS
102 DF033WW2 0 PCS
我現在想做的就是這樣。
df1 = pd.read_excel(r'\path\to_df1_excel', 'sheet1')
df2 = pd.read_excel(r'\path\to_df2_excel', 'sheet1')
分組以獲取總數量
cc_group = df1.groupby(['DU ID', 'Part Number'])['Qty'].sum().reset_index(name='cc_qty')
mr_group = df2.groupby(['DU ID', 'Part Number'])['Actual Qty'].sum().reset_index(name='mr_qty')
合並以比較數量和發現差異
output = cc_group.merge(mr_group, on=['DU ID', 'Part Number'], how='outer').query('cc_qty != mr_qty').fillna(0)
現在我被困在如何用實際數量(輸出中的mr_qty)更新dataframe1。 在這里需要一些幫助。
如果我對您的理解正確,則希望將d1
的數量更改為df2
的(實際)數量。 我認為有比您正在做的事情更直接的方法。 看一看:
import pandas as pd
df1 = pd.DataFrame({'DU ID':[102, 102, 102, 102, 102],
'Part Number':['00334567', '00334567', 'RRWQTDFG', '3456DDHE', 'DF033WW2'],
'Qty':[1, 2, 3, 4, 2],
'Unit':['PCS', 'PCS', 'PCS', 'PCS', 'PCS']})
df2 = pd.DataFrame({'DU ID':[102, 102, 102, 102],
'Part Number':['00334567', 'RRWQTDFG', '3456DDHE', 'DF033WW2'],
'Actual_Qty':[10, 3, 7, 0],
'Unit':['PCS', 'PCS', 'PCS', 'PCS']})
現在,您將兩個數據框合並:
df1 = df1.merge(df2, on=['Part Number', 'DU ID', 'Unit'])
DU ID Part Number Qty Unit Actual_Qty
0 102 00334567 1 PCS 10
1 102 00334567 2 PCS 10
2 102 RRWQTDFG 3 PCS 3
3 102 3456DDHE 4 PCS 7
4 102 DF033WW2 2 PCS 0
如果可以同時擁有兩個數量列,則可以停在這里,也可以清理:
df1 = df1[['DU ID', 'Part Number', 'Actual_Qty', 'Unit']]
df1.columns = ['DU ID', 'Part Number', 'Qty', 'Unit']
DU ID Part Number Qty Unit
0 102 00334567 10 PCS
1 102 00334567 10 PCS
2 102 RRWQTDFG 3 PCS
3 102 3456DDHE 7 PCS
4 102 DF033WW2 0 PCS
編輯 :顯然我誤會了。 這是您想要的( df1
和df2
與以前相同):
index_df = df1.reset_index().groupby(by='Part Number').last().reset_index()[['Part Number', 'index']]
quantities = pd.merge(df1.groupby(by='Part Number')['Qty'].sum().reset_index(), df2, on='Part Number')
quantities['missing_qty'] = quantities.Actual_Qty - quantities.Qty
quantities = quantities[['Part Number', 'missing_qty']]
new_info = pd.merge(index_df, quantities, on='Part Number')
new_info.set_index('index', inplace=True)
df1.loc[new_info.index, 'Qty'] = df1.loc[new_info.index, 'Qty'] + new_info['missing_qty']
DU ID Part Number Qty Unit
0 102 00334567 1 PCS
1 102 00334567 9 PCS
2 102 RRWQTDFG 3 PCS
3 102 3456DDHE 7 PCS
4 102 DF033WW2 0 PCS
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.