Python 向Dataframe中的分类数据添加标签
我试图转换婚姻状况的调查数据,如下所示:Python 向Dataframe中的分类数据添加标签,python,pandas,dataframe,categorical-data,Python,Pandas,Dataframe,Categorical Data,我试图转换婚姻状况的调查数据,如下所示: df['d11104'].value_counts() [1] Married 1 250507 [2] Single 2 99131 [4] Divorced 4 32817 [3] Widowed 3 24839 [5] Separated 5 8098 [-1] keine Angabe 2571 Name: d11104,
df['d11104'].value_counts()
[1] Married 1 250507
[2] Single 2 99131
[4] Divorced 4 32817
[3] Widowed 3 24839
[5] Separated 5 8098
[-1] keine Angabe 2571
Name: d11104, dtype: int64
到目前为止,我做了df['marstat']=df['d11104'].cat.codes.astype('category')
,得到了
df['marstat'].value_counts()
1 250507
2 99131
4 32817
3 24839
5 8098
0 2571
Name: marstat, dtype: int64
现在,我想在列marstat
中添加标签,以便保留数值,也就是说,我想通过条件df['marstat']==1
,同时将标签['已婚','单身','离异','widwowed']
附加到此变量。如何做到这一点
编辑:感谢jpp的回答,我简单地创建了一个新变量并手动定义了标签:
df['marstat_lb'] = df['marstat'].map({1: 'Married', 2: 'Single', 3: 'Widowed', 4: 'Divorced', 5: 'Separated'})
您可以将结果转换为数据帧,并在输出中包含类别代码和名称 可以通过枚举类别来提取类别映射字典。下面是一个简单的例子
import pandas as pd
df = pd.DataFrame({'A': ['M', 'M', 'S', 'D', 'W', 'M', 'M', 'S',
'S', 'S', 'M', 'W']}, dtype='category')
print(df.A.cat.categories)
# Index(['D', 'M', 'S', 'W'], dtype='object')
res = df.A.cat.codes.value_counts().to_frame('count')
cat_map = dict(enumerate(df.A.cat.categories))
res['A'] = res.index.map(cat_map.get)
print(res)
# count A
# 1 5 M
# 2 4 S
# 3 2 W
# 0 1 D
例如,您可以通过df['A']='M'
或df.index==1
访问“M”
更简单的解决方案是使用apply
value\u counts
,然后为代码添加一个额外的列:
res = df.A.value_counts().to_frame('count').reset_index()
res['code'] = res['index'].cat.codes
index count code
0 M 5 1
1 S 4 2
2 W 2 3
3 D 1 0
您可以将结果转换为数据帧,并在输出中包含类别代码和名称 可以通过枚举类别来提取类别映射字典。下面是一个简单的例子
import pandas as pd
df = pd.DataFrame({'A': ['M', 'M', 'S', 'D', 'W', 'M', 'M', 'S',
'S', 'S', 'M', 'W']}, dtype='category')
print(df.A.cat.categories)
# Index(['D', 'M', 'S', 'W'], dtype='object')
res = df.A.cat.codes.value_counts().to_frame('count')
cat_map = dict(enumerate(df.A.cat.categories))
res['A'] = res.index.map(cat_map.get)
print(res)
# count A
# 1 5 M
# 2 4 S
# 3 2 W
# 0 1 D
例如,您可以通过df['A']='M'
或df.index==1
访问“M”
更简单的解决方案是使用apply
value\u counts
,然后为代码添加一个额外的列:
res = df.A.value_counts().to_frame('count').reset_index()
res['code'] = res['index'].cat.codes
index count code
0 M 5 1
1 S 4 2
2 W 2 3
3 D 1 0
谢谢也许我不够具体。我不想处理频率表中的项目,而是单个数据中的项目。稍微改变一下方法,我尝试了:
df['marstat']=df['d1104'].cat.code
和labels=dict(枚举(df['d1104'].cat.categories))
。然而,df['marstat_lb']=df['marstat'].index.map(labels.get)
为df['marstat'].
的每个值都提供了None
,是否无法“沿着”分类数据设置一组标签(python术语中的映射(?)?来自Stata,这在那里非常常见。在您的示例中,您不需要执行df['marstat\u lb']=df['marstat']]。映射(标签)
?那么你不应该得到无
。谢谢。也许我不够具体。我不想处理频率表中的项目,而是单个数据中的项目。稍微改变一下方法,我尝试了:df['marstat']=df['d1104'].cat.code
和labels=dict(枚举(df['d1104'].cat.categories))
。然而,df['marstat_lb']=df['marstat'].index.map(labels.get)
为df['marstat'].
的每个值都提供了None
,是否无法“沿着”分类数据设置一组标签(python术语中的映射(?)?来自Stata,这在那里非常常见。在您的示例中,您不需要执行df['marstat\u lb']=df['marstat']]。映射(标签)
?那么你就不应该得到None
。。