【问题标题】:Populating a new column in a dataframe based on multi-level condititionals基于多级条件在数据框中填充新列
【发布时间】:2020-01-06 15:14:25
【问题描述】:

我正在尝试根据数据框中其他列的多个条件填充列 ['Mod_unMod'] ('cnms_df')。我写了一些pseudo-code来解释困难:

IF (cnms_df['CA'] = "NO"):
    IF (cnms_df['I'] ="X" OR cnms_df['I']="V" OR cnms_df['I']="VE" OR cnms_df['I']="0.2 PCT ANNUAL CHANCE FLOOD HAZARD" OR cnms_df['I']="AREA NOT INCLUDED")
        cnms_df['Mod_unMod'] = "UnMapped"
    ELSE IF (LEFT(cnms_df['STUDY_TYPE].str[:3])="NON")
        cnms_df['Mod_unMod'] ="NON"

    ELSE IF (cnms_df['BJ']="X" OR cnms_df['BJ']="V" OR cnms_df['BJ']="V" OR cnms_df['BJ']="VE" OR cnms_df['BJ']="0.2 PCT ANNUAL CHANCE FLOOD HAZARD" OR cnms_df['BJ']="AREA NOT INCLUDED")   
        cnms_df['Mod_unMod']
    ELSE IF (LEFT(BK2,3)="NON" 
        cnms_df['Mod_unMod']="UnMod"
    ELSE:
        cnms_df['Mod_unMod']="Modernized")
ELSE:
    cnms_df['Mod_unMod'] = "UnMapped"    

我已经应用了简单的np.where 语句,但我不确定如何使用上述级别来做到这一点。有没有办法以合乎逻辑的方式做这样的事情?

cnms_df['Mod_unMod'] = np.where((cnms_df['CA'] == 'No') & ((cnms_df['I'] ="X") | (cnms_df['I']="V") | (cnms_df['I']="VE") | (cnms_df['I']="0.2 PCT ANNUAL CHANCE FLOOD HAZARD") | (cnms_df['I']="AREA NOT INCLUDED")), "UnMapped", "Modernized")

【问题讨论】:

标签: python-3.x pandas if-statement conditional-statements


【解决方案1】:

定义生成新列内容的函数 当前行为:

def fun(row):
    lst = ['X', 'V', 'VE', '0.2 PCT ANNUAL CHANCE FLOOD HAZARD', 'AREA NOT INCLUDED']
    if row.CA != 'NO:
        return 'UnMapped'
    elif row.I in lst:
        return 'UnMapped'
    elif row.STUDY_TYPE[0:3] == 'NON':
        return 'NON'
    elif row.BJ in lst:
        return 'Mod_unMod'
    elif row.BK2[0:3] == 'NON':
        return 'UnMod'
    else:
        return 'Modernized'

然后将此函数应用于每一行,将结果保存在新列中:

df['Mod_unMod'] = df.apply(fun, axis=1)

【讨论】:

  • 虽然代码有点多,但我喜欢这种方法。它有一个逻辑流程,可以帮助我破译(我基本上是在翻译电子表格函数)嵌套条件。我不得不稍微调整一下,但效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2020-04-27
相关资源
最近更新 更多