请帮助朋友。
我想使用映射来匹配学生的年龄,并通过将其与包含1至18岁(儿童)和19至60岁(成人)的字典“ dlist”进行比较来将他们识别为成人或儿童。
# making Data Frame
age=np.random.randint(1,50,5,int)
name=['kashif', 'dawood', 'ali', 'zain', 'hamza']
df5=pd.DataFrame({'name':name,
'age':age})
# making dictionary
dlist={range(1,18):'child' , range(19,50):'adult'}
# now maping dictionary with data frame 'age' column elements to add status adult if age greater than 18 using dictionary
df5['Status']=df5.age.map(dlist)
但是它返回列名称为“ Status”但具有NAN值(而不是成人或儿童)的数据框
如果有错误,请无视我的英语。我不是说英语的人。
答案 0 :(得分:0)
您可以使用np.where
df5['status'] = np.where((df5['age']>=1) & (df5['age']<=18), 'child', 'adult')
print(df5)
name age status
kashif 15 child
dawood 11 child
ali 33 adult
zain 21 adult
hamza 31 adult
答案 1 :(得分:0)
在Python 3中,允许您将范围用作dict键,但是它似乎无法发挥您的想法。例如
print(dlist[1])
会给您一个密钥错误,因为密钥1
在dlist
中不存在
print(dlist[range(1,18)])
将起作用,因为您的密钥为range(1,18)
。这意味着您无法在dlist
功能中使用map
功能
要使用范围为键的字典,应改用apply
df5['Status'] = df5['age'].apply(
lambda x: next((v for k, v in dlist.items() if x in k), 'NA')
)
如果[v for k, v in dlist.items() if x in k]
在x
(这是一个范围)中,则k
会为您提供字典中所有值的列表。 next()
函数获得该列表中的下一个值(即第一个值)(但它也适用于迭代器,这就是为什么[]
可以省略的原因。NA
是默认值如果next()
不存在,请访问https://docs.python.org/3/library/functions.html#next
您应该注意范围(1,18)does NOT include 18。因此,使用此代码,年龄18岁的您将获得Status ='NA'
答案 2 :(得分:0)
这是我与大熊猫合作时的个人喜好。我总是将idx = np.where((np.maximum(np.abs(x), np.abs(y)) > 5) * (np.sqrt(x ** 2 + y ** 2) < 10))[0]
的熊猫方法与标签和容器列表结合使用来创建分类变量:
将numpy导入为np 将熊猫作为pd导入
cut()
答案 3 :(得分:0)
使用np.select
#specify conditions
conditions=[(df5['age']<=18),
(df5['age']>18)& (df5['age']<=50)]
#specify column output based on conditions
choices = ['child','adult'] #you can also specify numbers as well here
#create status column based on conditions
df5["status"] = np.select(conditions, choices)