【问题标题】:Map and compare 2 columns using conditional statement Python使用条件语句 Python 映射和比较 2 列
【发布时间】:2021-04-26 18:43:48
【问题描述】:

我正在寻找并使用条件语句从总价值中分离出应税价值。

如果 Tax_no1 列和 Tax_no2 列的前 2 个字符不同,那么我们必须从 Amount 列 计算 18% 的税百分比并更新 中的值value3 列

值3 = 金额*18/100

如果 Tax_no1 列和 Tax_no2 列的前 2 个字符相同,则我们必须计算 Amount 列 中的 18% 的税百分比除以 2 并更新value1 和 value2 列中的值

value1 = (金额 * 18/100)/2, value1 = (金额 * 18/100)/2

value1 = 金额 * 9/100,value2 = 金额 * 9/100

输入数据:

Tax_no1    Tax_No2     Amount      value1    value2    value3
AZ0001B    AZ0001B     35000
BZ0002A    CD0002A     12800.00
25CA895    25CA895     28967.90
NY78615    DY78615     367899.9
LO10985    LO10985     156789
01256NY    02256NY     2890657

预期输出值:

Tax_no1    Tax_No2     Amount      value1    value2    value3
AZ0001B    AZ0001B     35000        3150      3150      NaN
BZ0002A    CD0002A     12800.00     NaN       NaN       2304
25CA895    25CA895     28967.90     2607.11   2607.11   NaN
NY78615    DY78615     367899.9     NaN       NaN       66221.98
LO10985    LO10985     156789       14111.01  14111.01  NaN
01256NY    02256NY     2890657      NaN       NaN       520318.26

我尝试使用的脚本:

df['Tax1'] = df['Tax_no1'].str[:2]
df['Tax2'] = df['Tax_no2'].str[:2]

if df['Tax1'] != df['Tax2']:
   df['value3'] = Amount * 18/100
else:
   df['value1'] = Amount * 9/100
   df['value2'] = Amount * 9/100

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用布尔索引。首先创建一个比较前缀的掩码,然后您可以使用例如np.where:

    m = df["Tax_No1"].str[:2] == df["Tax_No2"].str[:2]
    
    df["value1"] = np.where(m, df.Amount * 9 / 2 / 100, np.nan)
    df["value2"] = np.where(m, df.Amount * 9 / 2 / 100, np.nan)
    df["value3"] = np.where(~m, df.Amount * 18 / 100, np.nan)
    
    print(df)
    

    打印:

       Tax_No1  Tax_No2     Amount     value1     value2      value3
    0  AZ0001B  AZ0001B    35000.0  1575.0000  1575.0000         NaN
    1  BZ0002A  CD0002A    12800.0        NaN        NaN    2304.000
    2  25CA895  25CA895    28967.9  1303.5555  1303.5555         NaN
    3  NY78615  DY78615   367899.9        NaN        NaN   66221.982
    4  LO10985  LO10985   156789.0  7055.5050  7055.5050         NaN
    5  01256NY  02256NY  2890657.0        NaN        NaN  520318.260
    

    【讨论】:

    • 谢谢@Andrej Kesely,需要您的帮助将条件语句修改为:如何执行这一行 ""m = df["Tax_No1"].str[:2] == df[" Tax_No2"].str[:2]"" 只有当它满足以下条件 "if df["Tax_No1"] != df["Tax_No2"]:",请帮忙,因为无法创建它。
    • @NKJ 不清楚您要做什么。 m = df["Tax_No1"].str[:2] == df["Tax_No2"].str[:2] 创建您使用的布尔掩码 np.wheredf.loc 等。
    【解决方案2】:

    这是实现此目的的另一种方法。

    
    import pandas as pd
    
    
    def tax_logic(row):
        if row['Tax_no1'][:2] != row['Tax_No2'][:2]:
           row['value3'] = row['Amount'] * 18/100
        else:
           row['value1'] = row['Amount'] * 9/100
           row['value2'] = row['Amount'] * 9/100
        return row
    
    df = df.apply(tax_logic, axis=1)
    
    print(df)
    
          Amount  Tax_No2  Tax_no1     value1     value2      value3
    0    35000.0  AZ0001B  AZ0001B   3150.000   3150.000         NaN
    1    12800.0  CD0002A  BZ0002A        NaN        NaN    2304.000
    2    28967.9  25CA895  25CA895   2607.111   2607.111         NaN
    3   367899.9  DY78615  NY78615        NaN        NaN   66221.982
    4   156789.0  LO10985  LO10985  14111.010  14111.010         NaN
    5  2890657.0  02256NY  01256NY        NaN        NaN  520318.260
    
    

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      相关资源
      最近更新 更多