簡體   English   中英

根據與另一個數據框的比較更新數據框值

[英]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

編輯 :顯然我誤會了。 這是您想要的( 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM