如何将数字数据映射到Pandas数据框中的类别/箱

我刚刚开始使用python进行编码,而我的一般编码技能相当生锈:(所以请耐心等待

它大约有300万行。年龄单位共有3种:Y,D,W(年),天和周。任何1岁以上的人的年龄单位均为Y,而我想要的第一个分组年龄小于2岁,因此我要测试的所有年龄单位均为Y ...


我想创建一个新列AgeRange并填充以下范围:


<2

2-18

18-35

35-65

65岁以上

所以我写了一个函数


def agerange(values):

    for i in values:

        if complete.Age_units == 'Y':

            if complete.Age > 1 AND < 18 return '2-18'

            elif complete.Age > 17 AND < 35 return '18-35'

            elif complete.Age > 34 AND < 65 return '35-65'

            elif complete.Age > 64 return '65+'

        else return '< 2'

我以为如果整体传入数据框,我会得到所需的信息,然后可以创建需要以下内容的列:


agedetails['age_range'] = ageRange(agedetails)

但是,当我尝试运行第一个代码来创建所得到的功能时:


  File "<ipython-input-124-cf39c7ce66d9>", line 4

    if complete.Age > 1 AND complete.Age < 18 return '2-18'

                          ^

SyntaxError: invalid syntax

显然,它不接受AND-但我想我在课堂上听说可以使用AND这样?我一定弄错了,但是这样做的正确方法是什么?


因此,在收到该错误后,我什至不确定传入数据帧的方法是否也会引发错误。我猜大概是。在这种情况下-我也将如何使它工作?


我想学习最好的方法,但是对我来说,最好的方法的一部分就是使它保持简单,即使这意味着要分几个步骤来做...


慕田峪9158850
浏览 487回答 2
2回答

杨魅力

使用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&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int64# Age_units&nbsp; &nbsp; &nbsp; object# AgeRange&nbsp; &nbsp; &nbsp;category# dtype: objectNumPy: np.digitizenp.digitize提供另一种干净的解决方案。这个想法是定义边界和名称,创建字典,然后应用于“ np.digitize年龄”列。最后,使用字典来映射类别名称。请注意,对于边界情况,下限用于映射到bin。import pandas as pd, numpy as npdf = pd.DataFrame({'Age': [99, 53, 71, 84, 84],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'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))结果&nbsp; &nbsp;Age Age_units AgeRange0&nbsp; &nbsp;99&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Y&nbsp; &nbsp; &nbsp; 65+1&nbsp; &nbsp;53&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Y&nbsp; &nbsp; 35-652&nbsp; &nbsp;71&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Y&nbsp; &nbsp; &nbsp; 65+3&nbsp; &nbsp;84&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Y&nbsp; &nbsp; &nbsp; 65+4&nbsp; &nbsp;84&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Y&nbsp; &nbsp; &nbsp; 65+

暮色呼如

这是BRILLIANT!感谢您为提供这样清晰而周到的响应而付出的麻烦,并且添加垃圾桶/熊猫切割方法的细节是锦上添花的完美方法。这是最简单最优雅的方法,我当然会使用它,谢谢。我在所有关于Bins的工作中都看过某个地方-但还没有弄清楚如何应用它,当然也不知道它会多么容易!再次感谢
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python