# Calculate percentage based on dummy variable in Pandas

Today I had a simple task: I have products, quantities and a dummy, and I needed to know which percentage of the total quantities of that product the dummy represented. My DataFrame looked like this:

Product    Qty    Dummy
A        10      0
B        15      0
B        5       1
C        5       0
D        5       0
D       20       1


And I needed to get there:

Product    Qty_pct
B        0.25
D        0.8


So, I only needed the percentage when the dummy takes value = 1

I managed to do it, like this:

df2=df.pivot_table(columns='Dummy',index='Product',aggfunc='sum',values=['Qty']).reset_index()
df2['Qty_pct']=df2['Qty'][1]/(df4['Qty'][1]+df2['Qty'][0])
df2.columns=df2.columns.get_level_values(0)


To me it seems like a very indirect way to achieve my goal and I feel this can be done in a way more elegant way. What would you do?

I think the better way is to use groupby. It looks more logical and "natural":

df = pd.DataFrame({
'Product': ['A', 'B', 'B', 'C', 'D', 'D'],
'Qty': [10, 15, 5, 5, 5, 20],
'Dummy': [0, 0, 1, 0, 0, 1]
})

# Create new column = Dummy*Qty
df['DQty'] = df['Dummy'] * df['Qty']

# Groupby df by 'Product' and summarize columns
df2 = df.groupby('Product').sum()

# Create new column equal to percentage of the total quantities
df2['Q'] = df2['DQty'] / df2['Qty']

# Drop unnecessary columns
df2 = df2.drop(columns=['Dummy', 'Qty', 'DQty'])

# Drop rows equal to zero
df2 = df2.loc[df2['Q'] != 0]
df2


The result is:

        Q
Product
B       0.25
D       0.80