【问题标题】:Python, Pandas - count values based on multiple criteria in row and multiple columnsPython,Pandas - 根据行和多列中的多个条件计算值
【发布时间】:2020-01-12 14:17:12
【问题描述】:
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 的日期)中的条件计算佣金。我希望看到使用 lambda 和没有 lambda AND 作为单独函数或简单代码(没有 def 专用函数)的解决方案。

【问题讨论】:

    标签: python-3.x pandas apply


    【解决方案1】:

    使用 lambda:

    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)
    

    【讨论】:

    • 谢谢@CodeDifferent。它按我想要的方式工作。在我的尝试中,我错过了 row ['Dates']
    【解决方案2】:

    试试:

    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
    

    【讨论】:

      猜你喜欢
      • 2020-06-24
      • 2020-11-21
      • 2021-12-19
      • 2020-09-21
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      相关资源
      最近更新 更多