Home > Mobile >  panda data frame applying multiple columns
panda data frame applying multiple columns

Time:04-14

product_code   order    eachprice  
TN45           10        500
BY11           20        360
AJ21           5         800

and i need to create a new column based on order and each price if order>=10, then 5% discount, order>=50 then 10% discount for the price, how can i apply a function to achieve this:

product_code  order   each_price   discounted_price
TN45          10       500          4500
BY11          20       360          6480
AJ21          5        800          4000

i tried to apply a function e.g. df['discount'] = df.apply(function, axis=1)

but errors prompts "A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead"

can anyone help? thanks

CodePudding user response:

You could use nested numpy.where calls to achieve this. I've added an extra intermediate column to the results for the percentage discount, then used this column to calculate the final discounted price:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'product_code': ['TN45', 'BY11', 'AJ21'],
    'order': [10, 20, 5],
    'each_price': [500, 360, 800]
})

df['discount'] = np.where(
    df['order'] >= 50,
    0.1,
    np.where(
        df['order'] >= 10,
        0.05,
        0
    )
)

df['discounted_price'] = df['order'] * df['each_price'] * (1 - df['discount'])

Note that my results are slightly different from those in your expected output, but I believe they are correct based on the description of the discount conditions you gave:

  product_code  order  each_price  discount  discounted_price
0         TN45     10        500      0.05            4750.0
1         BY11     20        360      0.05            6840.0
2         AJ21      5        800      0.00            4000.0

CodePudding user response:

As you mention you are trying by using apply function. I did the same and is working. I am not sure what part of the function was wrong in your case.

import pandas as pd
df = pd.DataFrame({
     'product_code': ['TN45', 'BY11', 'AJ21'],
     'order': [10, 20, 5],
     'each_price': [500, 360, 800]
})

# This is the apply function
def make_discount(row):
     total=row["order"] * row['each_price']
     if row["order"] >= 10:
         total=total - (total*0.05)
     elif row["order"] >= 50:
         total=total - (total*0.1)
     return total

Output:

df["discount_price"] = df.apply(make_discount, axis=1)
df
  product_code  order  each_price  discount_price
0         TN45     10         500          4750.0
1         BY11     20         360          6840.0
2         AJ21      5         800          4000.0
  • Related