熊猫映射功能使用字典转换数据

时间:2018-08-10 11:33:10

标签: pandas

请帮助朋友。

我想使用映射来匹配学生的年龄,并通过将其与包含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值(而不是成人或儿童)的数据框

如果有错误,请无视我的英语。我不是说英语的人。

4 个答案:

答案 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])

会给您一个密钥错误,因为密钥1dlist中不存在

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)