python - Pandas - 在方法链接中使用 assign 和 if-else 语句
问题描述
我来自 R 背景,我正在尝试mutate()
在 pandas 中复制 dplyr 的功能。
我有一个看起来像这样的数据框:
data = {'name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'age': [42, 52, 36, 24, 73],
'preTestScore': [4, 24, 31, 2, 3],
'postTestScore': [25, 94, 57, 62, 70]}
df = pd.DataFrame(data, columns = ['name', 'age', 'preTestScore', 'postTestScore'])
我现在正在尝试创建一个名为age_bracket
usingassign
方法的新列,如下所示:
(df.
assign(age_bracket= lambda x: "under 25" if x['age'] < 25 else
("25-34" if x['age'] < 35 else "35+"))
这引发了以下我无法理解的错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
我对以下解决方案不感兴趣:
df['age_bracket'] = np.where(df.age < 25, 'under 25',
(np.where(df.age < 35, "25-34", "35+")))
因为我不希望底层 df 改变。我试图在方法链接方面做得更好,我可以在不改变底层 df 的情况下以不同的方式快速探索我的 df。
有什么建议么?
解决方案
这是可能的,但不推荐,因为循环(在apply
函数的底层):
df = (df.
assign(age_bracket= lambda x: x['age'].apply(lambda y: "under 25" if y < 25 else
("25-34" if y < 35 else "35+"))))
print (df)
name age preTestScore postTestScore age_bracket
0 Jason 42 4 25 35+
1 Molly 52 24 94 35+
2 Tina 36 31 57 35+
3 Jake 24 2 62 under 25
4 Amy 73 3 70 35+
或者numpy.select
:
df = df.assign(age_bracket= np.select([df.age < 25,df.age < 35], ['under 25', "25-34"], "35+"))
但更好的是cut
在这里使用:
df = (df.assign(age_bracket= lambda x: pd.cut(x['age'],
bins=[0, 25, 35, 150],
labels=["under 25", "25-34", "35+"])))
推荐阅读
- c# - 使用条件操作创建 WIX 安装程序
- sql-server-2008-r2 - 如何通过文本出现在 SQL Server 上订购全文查询?
- javascript - 什么时候适合柯里化一个函数,什么时候不适合?为什么?
- angular - 如何使用对象创建表单生成器组?
- sql - 加入多个表 - Flutter - Firebase
- xamarin - Device.StartTime 是在单独的线程还是 UI 线程中运行?
- laravel - ubuntu 更新后 Laravel 会话中断
- lua - wrk.format 中不接受标头
- c# - c#如何使用多线程处理来自多个线程的多个返回值?
- javascript - 用于标记 Vim 中方法定义或调用之间的句点的语法高亮规则