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
。。