Pandas - 在方法链中使用分配和 if-else 语句

2023-12-21

我有 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 using assign方法如下:

(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+

Or numpy.select https://docs.scipy.org/doc/numpy/reference/generated/numpy.select.html:

df = df.assign(age_bracket= np.select([df.age < 25,df.age < 35], ['under 25', "25-34"], "35+"))

但更好的是使用cut http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.cut.html here:

df = (df.assign(age_bracket= lambda x: pd.cut(x['age'], 
                                              bins=[0, 25, 35, 150],
                                              labels=["under 25", "25-34", "35+"])))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas - 在方法链中使用分配和 if-else 语句 的相关文章

随机推荐