我有2个数据框需要比较,并根据数据框2的值更新数据框1的值。
dataframe1
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是具有唯一零件号和实际数量的列表。 dataframe2
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。这里需要一些帮助。
答案 0 :(得分:0)
如果我对您的理解正确,那么您想将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