python - Python Pandas 中的分组/分类年龄列
问题描述
我有一个数据框说df
。df
有一列'Ages'
>>> df['Age']
我想对这个年龄进行分组并创建一个类似这样的新列
If age >= 0 & age < 2 then AgeGroup = Infant
If age >= 2 & age < 4 then AgeGroup = Toddler
If age >= 4 & age < 13 then AgeGroup = Kid
If age >= 13 & age < 20 then AgeGroup = Teen
and so on .....
如何使用 Pandas 库实现这一点。
我试着做这样的事情
X_train_data['AgeGroup'][ X_train_data.Age < 13 ] = 'Kid'
X_train_data['AgeGroup'][ X_train_data.Age < 3 ] = 'Toddler'
X_train_data['AgeGroup'][ X_train_data.Age < 1 ] = 'Infant'
但这样做我得到这个警告
/Users/Anand/miniconda3/envs/learn/lib/python3.7/site-packages/ipykernel_launcher.py:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame 查看注意事项文档:http : //pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 这与 ipykernel 包是分开的,所以我们可以避免在 /Users/Anand/miniconda3/ 之前进行导入envs/learn/lib/python3.7/site-packages/ipykernel_launcher.py:4:SettingWithCopyWarning:试图在数据帧的切片副本上设置值
如何避免此警告并以更好的方式进行。
解决方案
使用pandas.cut
with 参数right=False
表示不包括 bin 的最右边:
X_train_data = pd.DataFrame({'Age':[0,2,4,13,35,-1,54]})
bins= [0,2,4,13,20,110]
labels = ['Infant','Toddler','Kid','Teen','Adult']
X_train_data['AgeGroup'] = pd.cut(X_train_data['Age'], bins=bins, labels=labels, right=False)
print (X_train_data)
Age AgeGroup
0 0 Infant
1 2 Toddler
2 4 Kid
3 13 Teen
4 35 Adult
5 -1 NaN
6 54 Adult
最后用于替换缺失值add_categories
使用fillna
:
X_train_data['AgeGroup'] = X_train_data['AgeGroup'].cat.add_categories('unknown')
.fillna('unknown')
print (X_train_data)
Age AgeGroup
0 0 Infant
1 2 Toddler
2 4 Kid
3 13 Teen
4 35 Adult
5 -1 unknown
6 54 Adult
bins= [-1,0,2,4,13,20, 110]
labels = ['unknown','Infant','Toddler','Kid','Teen', 'Adult']
X_train_data['AgeGroup'] = pd.cut(X_train_data['Age'], bins=bins, labels=labels, right=False)
print (X_train_data)
Age AgeGroup
0 0 Infant
1 2 Toddler
2 4 Kid
3 13 Teen
4 35 Adult
5 -1 unknown
6 54 Adult
推荐阅读
- php - mysql 获取昨天的标志(另一列不是日期时间类型)
- r - 循环一个向量以将其应用于函数以执行网络抓取
- opennlp - 如何使用 NLP 将句子拆分为文本和数字?
- c++ - //usr/lib64/librt.so.1:命令行中缺少 DSO
- d3.js - 使用 d3 v6 获取 x 轴上的刻度,其中 scalesBand 在列下方居中
- java - 构造Balanced BST,包括每个节点及其子节点的总和输出应该是新的二叉搜索树的postOrder遍历
- angular - 将 Observable 转换为数组
- jmeter - 如何在jmeter的request2中使用来自response1的数组?
- python-module - Python包没有正确导入
- asp.net-core - 如何在不使用 Microsoft.AspNetCore.Identity.UI 的情况下设置 OpenIddict 以依赖 AzureAd