I am trying to multiply quantity defined as column ['TRGQTY'] within different rows in my DataFrame based on the condition defined for other columns. I want to take the ['TRGQTY'] where ['SUBPACKNR'] is not blank and multiply it with ['TRGQTY'] of all rows that containe in column ['BALICI_INSTRUKCE'] == 'PV%+1'(this column express the level -> PV2 = level 2 or PV3 = level 3).
import pandas as pd
df = pd.DataFrame({'DISPO': ['580', '580', '580','580', '580', '580'],
'MATNR_FERT': ['04440210721VL', '04440210721VL', '04440210721VL','04440210721VL', '04440210721VL', '04440210721VL'],
'STATUS_FERT': ['40', '40', '40','40', '40', '40'],
'PACKNR': ['GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNW','GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNW'],
'BALICI_INSTRUKCE': ['PV2', 'PV1', 'PV2','PV1', 'PV1', 'PV2'], 'ČÍSLO_MATERIÁLU': ['6000146128', '6000129044', '6099504147','6000100412', '', '04440210721VL'],
'SUBPACKNR': ['', '', '','', 'GgZK{OS27kYc{uX22fOQNW', ''],
'TRGQTY': ['1', '1', '1','1', '60', '20'],
'BASEUNIT': ['ST', 'ST', 'ST','ST', 'ST', 'ST'] })
data_csv = [[DISPO, MATNR_FERT, STATUS_FERT, PACKNR, BALICI_INSTRUKCE, ČÍSLO_MATERIÁLU, SUBPACKNR, TRGQTY, BASEUNIT], [580, 04440210721VL, 40 ,GgZK{OS27kYc{uX22fOQNW, PV2, 6000146128, 1, ST], [580, 04440210721VL, 40, GgZK{OS27kYc{uX3IyhQNW, PV1, 6000129044, 1, ST], [580, 04440210721VL, 40, GgZK{OS27kYc{uX22fOQNW, PV2, 6099504147, 1, ST], [580, 04440210721VL, 40, GgZK{OS27kYc{uX3IyhQNW, PV1, 6000100412, 1, ST], [580, 04440210721VL, 40, GgZK{OS27kYc{uX3IyhQNW, PV1, GgZK{OS27kYc{uX22fOQNW, 60, ST], [580, 04440210721VL, 40, GgZK{OS27kYc{uX22fOQNW, PV2, 04440210721VL, 20, ST]]
This is my code, but the multiplication does not work correctly.
df_cislodilu = [data_csv]
nasobky = {}
for i in pd.unique(df_cislodilu['MATNR_FERT']):
df_subset = df_cislodilu[df_cislodilu['MATNR_FERT'] == i]
multiplicator = df_subset[~df_subset['SUBPACKNR'].isna()] #nefunguje pro výběr násobku
level = df_subset[df_subset['BALICI_INSTRUKCE'] == 'PV2'] # or 'PV%'+1
final = level['TRGQTY'].prod()
nasobky[i] = df_subset['TRGQTY'] * final
nasobky = pd.DataFrame(nasobky)
print(nasobky)
This is the result of this code
This is what I need:
Sourcecode for more 'MATNR_FERT':
df = pd.DataFrame({ 'DISPO': ['580', '580', '580', '580', '580', '580', '580', '580', '580', '580', '580', '580'], 'MATNR_FERT': ['04440210721VL', '04440210721VL', '04440210721VL', '04440210721VL', '04440210721VL', '04440210721VL', '04440210722A5', '04440210722A5', '04440210722A5', '04440210722A5', '04440210722A5', '04440210722A5'], 'STATUS_FERT': ['40', '40', '40', '40', '40', '40', '40', '40', '40', '40', '40', '40'], 'PACKNR': ['GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNW', 'GgZK{OS27kYc{uX22fOQNM', 'GgZK{OS27kYc{uX22fOQNM', 'GgZK{OS27kYc{uX22fOQNM', 'GgZK{OS27kYc{uX22fOQNM', 'GgZK{OS27kYc{uX22fOQNM', 'GgZK{OS27kYc{uX22fOQNM'], 'BALICI_INSTRUKCE': ['PV2', 'PV1', 'PV2', 'PV1', 'PV1', 'PV2', 'PV2', 'PV1', 'PV2', 'PV1', 'PV1', 'PV2'], 'ČÍSLO_MATERIÁLU': ['6000146128', '6000129044', '6099504147', '6000100412', '', '04440210721VL', '6000146128', '6000129044', '6099504147', '6000100412', '', '04440210721VL'], 'SUBPACKNR': ['', '', '', '', 'GgZK{OS27kYc{uX22fOQNW}', '', '', '', '', '', 'GgZK{OS27jcWY}lueMkCeW', ''], 'TRGQTY': ['1', '1', '1', '1', '60', '20', '1', '1', '1', '1', '60', '20'], 'BASEUNIT': ['ST', 'ST', 'ST', 'ST', 'ST', 'ST', 'ST', 'ST', 'ST', 'ST', 'ST', 'ST'] })
Code for multiplication:
enter code here
# ensure having numeric data
df['TRGQTY'] = df['TRGQTY'].astype(int)
#sort values by ['part_number']
df = df.sort_values(by=['part_number'])
#create subset table and operate within each small subset table with same PART_NUMBER
df = df['part_number'].unique()
# is BALICI_INSTRUKCE PV1?
m1 = df['BALICI_INSTRUKCE'].eq('PV1')
# is BALICI_INSTRUKCE PV2/PV3/PV4?
m2 = df['BALICI_INSTRUKCE'].eq('PV2')
m3 = df['BALICI_INSTRUKCE'].eq('PV3')
m4 = df['BALICI_INSTRUKCE'].eq('PV4')
# is SUBPACKNR not an empty string?
m5 = df['SUBPACKNR'].ne('')
# if m1 and m3 are True, get the first value
ref = df.loc[m1&m5, 'TRGQTY'].iloc[0] # 60
# multiply the PV2 by the reference
df.loc[m2|m3|m4, 'TRGQTY'] *= ref
print(df)