我正在尝试根据来自其他几个值的值创建一个有条件的新变量.我在这里写,因为我已经尝试将它写为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] 举报,一经查实,本站将立刻删除。