Python, Pandas - подсчет значений на основе нескольких критериев в строке и нескольких столбцах - PullRequest
0 голосов
/ 12 января 2020
import pandas as pd
import datetime as dt

df = []
df = pd.DataFrame({"Sales": [1000, 2000, 3000, 4000, 5000], "Dates": pd.date_range(dt.date.today(), periods=5).astype(str)})

myDate = "2020-01-12"

def count_Commission(row):
  if (row > 3000 or df.Dates < myDate):
    return row * 0.1
  else:
    return 0

df['Commission'] = df.Sales.apply(count_Commission)
print(df)

Я хочу рассчитать комиссионные на основе критериев в продажах (значение> 3000) и датах (для дат, предшествующих myDate). Я хотел бы видеть решения с лямбда-выражением и без лямбда-выражения И в качестве отдельной функции или простого кода (без специальной функции def).

Ответы [ 2 ]

1 голос
/ 12 января 2020

Попробуйте:

import numpy as np

df['Commission'] = np.where((df.Dates<myDate) | (df.Sales>3000), df.Sales*0.1, 0)

В качестве альтернативы вы можете использовать loc[...] метод:

df['Commission']=0
df.loc[(df.Dates<myDate) | (df.Sales>3000), 'Commission'] = df.Sales*0.1

Выход:

   Sales       Dates  Commission
0   1000  2020-01-12         0.0
1   2000  2020-01-13         0.0
2   3000  2020-01-14         0.0
3   4000  2020-01-15       400.0
4   5000  2020-01-16       500.0
1 голос
/ 12 января 2020

С лямбдой:

df['Commission'] = df.apply(lambda row: row['Sales'] * 0.1 if (row['Sales'] > 3000 or row['Dates'] < myDate) else 0, axis=1)

С "выделенной функцией":

def calculate_commission(row):
    return row['Sales'] * 0.1 if (row['Sales'] > 3000 or row['Dates'] < myDate

df['Commission'] = df.apply(calculate_commission, axis=1)

Векторизация (самая быстрая):

df['Commission'] = np.where((df['Sales'] > 3000) | (df['Dates'] < myDate), df['Sales'] * 0.1, 0)
...