Python 如何将数字数据映射到dataframe中的类别/容器中

Python 如何将数字数据映射到dataframe中的类别/容器中,python,python-2.7,pandas,numpy,dataframe,Python,Python 2.7,Pandas,Numpy,Dataframe,我刚刚开始用python编写代码,我的一般编码技能已经相当生疏了:(所以请耐心一点 我有一个数据框: 它大约有3m排。有3种年龄单位:年、日和周的Y、D、W。任何一个超过1岁的人都有一个Y的年龄单位,我想要的第一个分组是1并完整。年龄1和complete。Age

我刚刚开始用python编写代码,我的一般编码技能已经相当生疏了:(所以请耐心一点

我有一个数据框:

它大约有3m排。有3种年龄单位:年、日和周的Y、D、W。任何一个超过1岁的人都有一个Y的年龄单位,我想要的第一个分组是1并完整。年龄<18返回“2-18” ^ SyntaxError:无效语法 很明显,这不是接受和-但我想我在课堂上听到我可以使用和这样做?我一定是弄错了,但这样做的正确方式是什么

因此,在出现错误后,我甚至不确定传入数据帧的方法是否也会抛出错误。我猜可能是的。在这种情况下,我将如何使其工作


我希望学习最好的方法,但对我来说,最好的方法之一是保持简单,即使这意味着只需几个步骤就可以完成任务……

对于Pandas,您应该避免行操作,因为这些操作通常涉及低效的Python级循环。以下是一些替代方法

熊猫: 正如@JonClements所建议的,您可以使用
pd.cut
来实现这一点,这里的好处是您的新专栏将成为一个新的专栏

您只需定义边界(包括
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
结果
@jpp给出了下面一个很好的答案-也考虑到你的无效语法,应该是小写字母
,如果你需要使用
,那么如果完成,应该是
。Age>1和complete。Age<18:返回'2-18'
或…添加
float('inf')
(或
np.inf
)到
料仓的末尾,然后使用:
pd.cut(df.Age、料仓、标签=名称)
…这样你将得到一个分类系列而不是字符串…@jpp这太棒了!感谢你不辞辛劳地提供了如此清晰和深思熟虑的响应,添加带有细节的bins/pandas cut方法是完美的锦上添花。这是最简单最优雅的方法,我当然正在使用谢谢。我在所有关于垃圾箱的研究中都看到了一些东西,但我还没有弄明白如何应用它,当然也没有弄明白它有多容易!再次感谢!
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
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
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+