如何访问在数据框中另存为对象的分类数据?

时间:2019-06-17 08:37:34

标签: python pandas dataframe

我有.dta个数据,我在df = pd.read_stata('mydata.dta', convert_categoricals=True)中加载了数据。从Stata转换类别时,我可以更轻松地“查看”类别的含义。但是我找不到处理这种格式数据的选项。它实际上已转换为字符串/对象。

我在SA上没有找到任何答案也发现了类似的问题:Pandas doesnt recognize categorical — access original codes when convert_categorical=True

我的解决方法是不从dta转换猫。 df = pd.read_stata('mydata.dta', convert_categoricals=False)然后可以进行计算等,但是我必须手动查找所有类别。那不是很pythonic。

对这种情况进行MWE确实很困难。就像这样:

import pandas as pd
df = pd.DataFrame({'year': ['1988', '1988', '1988', '1988', '1989', '1989', '1989', '1989'],
                  'money': ['5', '7', '8', '8', '3', '3', '7', '8']}).astype(int)

health = ['2 [good]', '-2 [not applicable]', '3 [ok]', '1 [excellent]', '3 [ok]', '5 [bad]', '2 [good]', '1 [excellent]']
df['health'] = health
df.info() # health is an object

# df.loc[(df.health >= 2) & (df.year=1988), 'money'] # not working

在我的分析中,我想检查给定年份中身体健康的人的钱。但是类别是字符串。我有很多变量和类别。

如何告诉数据框使用“方括号前面的数字”?

处理数据框中类别的“值”和“标签”的正确方法是什么?正确的数据类型是什么?

1 个答案:

答案 0 :(得分:2)

这里有必要使用Series.str.extracthealth值中获取新列的值:

df[['a','b']] = df['health'].str.extract('([-]?\d+)\s+\[(.+)\]')
df['a'] = df['a'].astype(int)
print (df)
   year  money               health  a               b
0  1988      5             2 [good]  2            good
1  1988      7  -2 [not applicable] -2  not applicable
2  1988      8               3 [ok]  3              ok
3  1988      8        1 [excellent]  1       excellent
4  1989      3               3 [ok]  3              ok
5  1989      3              5 [bad]  5             bad
6  1989      7             2 [good]  2            good
7  1989      8        1 [excellent]  1       excellent