当前位置: 代码迷 >> python >> 将嵌套if语句应用于df
  详细解决方案

将嵌套if语句应用于df

热度:77   发布时间:2023-06-16 10:06:44.0

以下代码必须执行一些步骤:

  1. 如果“批发数据”列的使用率大于等于“ mbs”列
  2. 减去“批发数据”列-“ mbs”
  3. 根据下表乘以差异

    • 32-0.56
    • 64-0.5
    • 128-0.4
    • 256-0.4
    • 512-0.3
    • 1024-0.3
  4. 对于所有其他可能的选项-0

我有以下代码

if df['Wholesale Data Usage'] >= df['mbs']:
    if df['mbs'] == "32":
        df['Additional Charge'] = (df['Wholesale Data Usage'] - df[
        'mbs']) * 0.5
    elif df['mbs'] == "64":
        df['Additional Charge'] = (df['Wholesale Data Usage'] - df[
        'mbs']) * 0.5
    elif df['mbs'] == "128":
        df['Additional Charge'] = (df['Wholesale Data Usage'] - df[
        'mbs']) * 0.4
    elif df['mbs'] == "256":
        df['Additional Charge'] = (df['Wholesale Data Usage'] - df[
        'mbs']) * 0.4
    elif df['mbs'] == "512":
        df['Additional Charge'] = (df['Wholesale Data Usage'] - df[
        'mbs']) * 0.3
    elif df['mbs'] == "1024":
        df['Additional Charge'] = (df['Wholesale Data Usage'] - df[
        'mbs']) * 0.3
    else:
        df['Additional Charge'] = 0
else:
    df['Additional Charge'] = 0

不知道我在做什么错。

首先,对于32,您乘以0.5,而不是0.56。

然后,似乎您已经混淆了StringsIntegers 如果df['Wholesale Data Usage']df['mbs']存储的数据的类型为String,则您不能检查大于( >= ),也不能从中减去一个。

我怀疑存储在字典中的数据是IntegerFloatDouble类型的。 在这种情况下,您尝试将数据与字符串进行比较,并应更改以下内容:

if df['mbs'] == "32":

至:

if df['mbs'] == 32:

并在每次比较时都这样做

您的代码是如此难以阅读,难以调试。 编码样式将帮助您查看自己认为的错误。 如果你这样写怎么办?

mbs = df['mbs']
wdu = df['Wholesale Data Usage']

ac = 0
if wdu >= mbs and mbs == "32"   : ac = (wdu - mbs) * 0.56
if wdu >= mbs and mbs == "64"   : ac = (wdu - mbs) * 0.5
if wdu >= mbs and mbs == "128"  : ac = (wdu - mbs) * 0.4
if wdu >= mbs and mbs == "256"  : ac = (wdu - mbs) * 0.4
if wdu >= mbs and mbs == "512"  : ac = (wdu - mbs) * 0.3
if wdu >= mbs and mbs == "1024" : ac = (wdu - mbs) * 0.3

df['Additional Charge'] = ac

话虽这么说,您有类型问题。 我正在比较的第一个等式mbs=="32"好像您有一个字符串。 然后在方程式中尝试添加值,就好像它们包含一个int一样-这将无法工作。 让类型变得合理。

mbs = float(df['mbs'])
wdu = float(df['Wholesale Data Usage'])

ac = 0
if wdu >= mbs and mbs == 32   : ac = (wdu - mbs) * 0.56
if wdu >= mbs and mbs == 64   : ac = (wdu - mbs) * 0.5
if wdu >= mbs and mbs == 128  : ac = (wdu - mbs) * 0.4
if wdu >= mbs and mbs == 256  : ac = (wdu - mbs) * 0.4
if wdu >= mbs and mbs == 512  : ac = (wdu - mbs) * 0.3
if wdu >= mbs and mbs == 1024 : ac = (wdu - mbs) * 0.3

df['Additional Charge'] = str(ac) #<- you need to know what the expected type is here. 

我认为您的逻辑以及代码逐步通过逻辑的方式存在一些问题,例如,您检查mbs列是否等于32,但实际上应该是“ Wholesale Data Usage列与mbs栏等于32。

这应该可以解决您的逻辑问题,而无需编辑过多的代码:

df['mbs'] = np.where(df['Wholesale Data Usage'] >= df['mbs'], df['Wholesale Data Usage']-df['mbs'], 0)

if df['mbs'] == "32":
    df['Additional Charge'] = (df['mbs']) * 0.5
elif df['mbs'] == "64":
    df['Additional Charge'] = (df['mbs']) * 0.5
elif df['mbs'] == "128":
    df['Additional Charge'] = (df['mbs']) * 0.4
elif df['mbs'] == "256":
    df['Additional Charge'] = (df['mbs']) * 0.4
elif df['mbs'] == "512":
    df['Additional Charge'] = (df['mbs']) * 0.3
elif df['mbs'] == "1024":
    df['Additional Charge'] = (df['mbs']) * 0.3
else:
    df['Additional Charge'] = 0
  相关解决方案