微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python / Pandas – 基于几个变量和if / elif / else函数创建新变量

我正在尝试根据来自其他几个值的值创建一个有条件的新变量.我在这里写,因为我已经尝试将它写为R中的嵌套ifelse()语句,但它有太多嵌套的ifelse,所以它抛出了一个错误,我认为应该有一种更简单的方法解决这个问题在Python中.

我有一个数据框(称为df)看起来大致像这样(虽然实际上它有更大的月份/年变量)我已经读作大熊猫DataFrame:

   ID  Sept_2015  Oct_2015  Nov_2015  Dec_2015  Jan_2016  Feb_2016  Mar_2016  \
0   1          0         0         0         0         1         1         1   
1   2          0         0         0         0         0         0         0   
2   3          0         0         0         0         1         1         1   
3   4          0         0         0         0         0         0         0   
4   5          1         1         1         1         1         1         1   

   grad_time  
0        240  
1        218  
2        236  
3          0  
4        206 

我正在尝试创建一个取决于所有这些变量的值的新变量,但“早期”变量的值需要有先例,所以if / elif / else条件需要这样的东西:

if df['Sept_2015'] > 0 & df['grad_time'] <= 236:
    return 236
elif df['Oct_2015'] > 0 & df['grad_time'] <= 237:
    return 237
elif df['Nov_2015'] > 0 & df['grad_time'] <= 238:
    return 238
elif df['Dec_2015'] > 0 & df['grad_time'] <= 239:
    return 239
elif df['Jan_2016'] > 0 & df['grad_time'] <= 240:
    return 240
elif df['Feb_2016'] > 0 & df['grad_time'] <= 241:
    return 241
elif df['Mar_2016'] > 0 & df['grad_time'] <= 242:
    return 242
else:
    return 0

基于此,我希望它返回一个如下所示的新变量:

   trisk
0    240
1      0
2    240
3      0
4    236

我试过写这样的函数

def test_func(df):
    """ Test Function for generating new value"""
    if df['Sept_2015'] > 0 & df['grad_time'] <= 236:
        return 236
    elif df['Oct_2015'] > 0 & df['grad_time'] <= 237:
        return 237
    ...
    else:
        return 0

并将其映射到数据框以创建新变量,如下所示:

new_df = pd.DataFrame(map(test_func, df)) 

但是,当我运行它时,我得到以下TypeError

 Traceback (most recent call last):

  File "<ipython-input-83-19b45bcda45a>", line 1, in <module>
     new_df = pd.DataFrame(map(new_func, test_df))

  File "<ipython-input-82-a2eb6f9d7a3a>", line 3, in new_func
     if df['Sept_2015'] > 0 & df['grad_time'] <= 236:

TypeError: string indices must be integers, not str

所以我可以看到它不希望列名在这里.但我已经尝试了许多其他方法,但无法让它发挥作用.另外,我理解这可能不是写这个(映射函数)的最好方法,所以我愿意尝试解决生成trisk变量问题的新方法.如果我没有提供任何东西,请提前致谢并道歉.

解决方法:

无需简化逻辑(@pirsquared进入):您可以通过向数据帧发出.apply(test_func,axis = 1)来将test_func应用于行.

import io
import pandas as pd

data = io.StringIO('''\
   ID  Sept_2015  Oct_2015  Nov_2015  Dec_2015  Jan_2016  Feb_2016  Mar_2016  grad_time  
0   1          0         0         0         0         1         1         1        240
1   2          0         0         0         0         0         0         0        218   
2   3          0         0         0         0         1         1         1        236
3   4          0         0         0         0         0         0         0          0
4   5          1         1         1         1         1         1         1        206
''')
df = pd.read_csv(data, delim_whitespace=True)

def test_func(df):
    """ Test Function for generating new value"""
    if df['Sept_2015'] > 0 & df['grad_time'] <= 236:
        return 236
    elif df['Oct_2015'] > 0 & df['grad_time'] <= 237:
        return 237
    elif df['Nov_2015'] > 0 & df['grad_time'] <= 238:
        return 238
    elif df['Dec_2015'] > 0 & df['grad_time'] <= 239:
        return 239
    elif df['Jan_2016'] > 0 & df['grad_time'] <= 240:
        return 240
    elif df['Feb_2016'] > 0 & df['grad_time'] <= 241:
        return 241
    elif df['Mar_2016'] > 0 & df['grad_time'] <= 242:
        return 242
    else:
        return 0

trisk = df.apply(test_func, axis=1)
trick.name = 'trisk'
print(trisk)

输出

0    240
1      0
2    240
3      0
4    236
Name: trisk, dtype: int64

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐