根据与另一个数据框的比较更新数据框值

时间:2018-07-20 08:15:07

标签: python pandas

我有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。这里需要一些帮助。

1 个答案:

答案 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

编辑:我误会了。这就是您想要的(df1df2与以前一样)

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