2 回答
TA贡献1811条经验 获得超6个赞
使用Pandas时,应避免按行操作,因为这些操作通常涉及效率低下的Python级循环。这里有两个选择。
熊猫: pd.cut
正如@JonClements所建议的,您可以使用pd.cut它,这里的好处是您的新列将成为Categorical。
您只需要定义边界(包括np.inf)和类别名称,然后将其应用于pd.cut所需的数字列即可。
bins = [0, 2, 18, 35, 65, np.inf]
names = ['<2', '2-18', '18-35', '35-65', '65+']
df['AgeRange'] = pd.cut(df['Age'], bins, labels=names)
print(df.dtypes)
# Age int64
# Age_units object
# AgeRange category
# dtype: object
NumPy: np.digitize
np.digitize提供另一种干净的解决方案。这个想法是定义边界和名称,创建字典,然后应用于“ np.digitize年龄”列。最后,使用字典来映射类别名称。
请注意,对于边界情况,下限用于映射到bin。
import pandas as pd, numpy as np
df = pd.DataFrame({'Age': [99, 53, 71, 84, 84],
'Age_units': ['Y', 'Y', 'Y', 'Y', 'Y']})
bins = [0, 2, 18, 35, 65]
names = ['<2', '2-18', '18-35', '35-65', '65+']
d = dict(enumerate(names, 1))
df['AgeRange'] = np.vectorize(d.get)(np.digitize(df['Age'], bins))
结果
Age Age_units AgeRange
0 99 Y 65+
1 53 Y 35-65
2 71 Y 65+
3 84 Y 65+
4 84 Y 65+
TA贡献1853条经验 获得超9个赞
这是BRILLIANT!感谢您为提供这样清晰而周到的响应而付出的麻烦,并且添加垃圾桶/熊猫切割方法的细节是锦上添花的完美方法。这是最简单最优雅的方法,我当然会使用它,谢谢。我在所有关于Bins的工作中都看过某个地方-但还没有弄清楚如何应用它,当然也不知道它会多么容易!再次感谢
添加回答
举报