我有.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
在我的分析中,我想检查给定年份中身体健康的人的钱。但是类别是字符串。我有很多变量和类别。
如何告诉数据框使用“方括号前面的数字”?
处理数据框中类别的“值”和“标签”的正确方法是什么?正确的数据类型是什么?
答案 0 :(得分:2)
这里有必要使用Series.str.extract
从health
值中获取新列的值:
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