Обновление значения одного столбца в фрейме данных, если совпадение ID найдено в столбце другого фрейма данных - PullRequest
1 голос
/ 27 мая 2020

У меня есть два фрейма данных. Второй фрейм данных является производным от первого фрейма данных. Я обновляю столбец во втором фрейме данных, а затем хочу вернуть обновленные значения в первый фрейм данных. Я пробовал «объединить», но он дает мне два столбца с суффиксами «_x» и «_y»

import pandas

lotQtyQueryForDF = pandas.read_sql_query(refreshQuery,conForInfo)
dataFrameOfLots = pandas.DataFrame(lotQtyQueryForDF,columns=['Customer','Stage','ProdType','Brand','ProdName','Size','Strength','Lot','PackedOn','Qty','Available'])

dataFrameOfLots['Available']=dataFrameOfLots["Available"].fillna(dataFrameOfLots['Qty'])
#inserting columns
dataFrameOfLots['QtyInTransaction']=0   
dataFrameOfLots['IndexCol'] = range(1, len(dataFrameOfLots) + 1)

dataFrameFiltered=dataFrameOfLots.query('Brand=="XYZ" & Customer=="ABC"')
dataFrameFiltered.loc[:,'Qty in transaction']=34
dataFrameFiltered2=dataFrameFiltered[['Qty in transaction','IndexCol']].copy()
dataFrameOfLots.merge(dataFrameFiltered2,on='IndexCol',how='outer')

Входной набор данных:

Customer Stage ProdType Brand ProdName Size Strength Lot PackedOn Qty Available

DEF      A       Bulk    YYY   Test    Test   Weak    1   20200101 10    5            

ABC      A       Bulk    XYZ   Test    Test   Weak    1   20200101 10    5            

GHI      A       Bulk    YTY   Test    Test   Weak    1   20200101 10    5            

ABC      B       RAW     XYZ   Test    Test   Weak    1   20200101 10    5            

Фактический результат:

Customer Stage ProdType Brand ProdName Size Strength Lot PackedOn Qty Available QtyInTransaction_x IndexCol QtyInTransaction_y

DEF      A       Bulk    YYY   Test    Test   Weak    1   20200101 10    5            0               1             0 

ABC      A       Bulk    XYZ   Test    Test   Weak    1   20200101 10    5            0               2             34 

GHI      A       Bulk    YTY   Test    Test   Weak    1   20200101 10    5            0               3             0 

ABC      B       RAW     XYZ   Test    Test   Weak    1   20200101 10    5            0               4             34

Ожидаемый результат:

Customer Stage ProdType Brand ProdName Size Strength Lot PackedOn Qty Available IndexCol QtyInTransaction

DEF      A       Bulk    YYY   Test    Test   Weak    1   20200101 10    5           1             0 

ABC      A       Bulk    XYZ   Test    Test   Weak    1   20200101 10    5           2             34 

GHI      A       Bulk    YTY   Test    Test   Weak    1   20200101 10    5           3             0 

ABC      B       RAW     XYZ   Test    Test   Weak    1   20200101 10    5           4             34

Правильный ли подход - запрос? Как мне слить, чтобы отображался только один столбец?

Спасибо

1 Ответ

1 голос
/ 27 мая 2020

Пожалуйста, попробуйте использовать внешнее слияние и удалить ненужные строки после выполнения фильтров. Код ниже.

result=pd.merge(dataFrameOfLots, dataFrameFiltered, how='outer', on=['Customer', 'Stage', 'ProdType', 'Brand', 'ProdName', 'Size',
       'Strength', 'Lot', 'PackedOn', 'Qty', 'Available'],suffixes=('_x', '')).fillna(0)
result=result.loc[:,~result.columns.str.endswith('_x')]#drop unwanted columns

или

result.drop(columns=['QtyInTransaction_x','IndexCol_x'], inplace=True)#drop unwanted columns
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...