我正在尝试在python中创建交叉制表频率表,如同在SAS中的双向频率一样。
在SAS中,他们使用PROC FORMAT根据要求在输出中显示少量内容。
如何在python中实现这一目标?例如,其中一个数据集的列为age_group,类别为1,2,3,4,5,6,7和8。
但是在打印输出中,我希望将它们显示为' 0-23',' 24-27',' 48-59',&#39 ; 60-71'' 72-79'' 80-87'' 88-99'和' 100 +'分别与他们的频率。 (注意:我不想更改原始数据)。
我检查了一些格式化选项,但其中大多数似乎是浮点数等。我该如何为打印执行此自定义格式设置?
由于
答案 0 :(得分:0)
您可以使用cat.rename_categories()
方法重命名类别。如果您希望使用原始级别,则可以使用cat.codes
来获取基础整数。这是一个可重复的例子:
df = pd.DataFrame({'age_group':["1","2","3","4","5","6","7"]},
dtype="category")
# Rename categories
df.age_group = df.age_group.cat.rename_categories([ '0-23','24-27','48-59',
'60-71','72-79','80-87','88-99'])
# Test
> df
age_group
0 0-23
1 24-27
2 48-59
3 60-71
4 72-79
5 80-87
6 88-99
# Underlying integers
> df.age_group.cat.codes
0 0
1 1
2 2
3 3
4 4
5 5
6 6
dtype: int8
或者,如果您的列不是分类,则可以将字典与.replace()
结合使用以打印关联的值。
# Create data and dictionary
df = pd.DataFrame({'age_group':[1,2,3,4,5,6,7,8]})
d = {1:'0-23',2:'24-27',3:'48-59',4:'60-71',5:'72-79',6:'80-87',7:'88-99'}
# Print matching values
df.replace({"age_group": d})
age_group
0 0-23
1 24-27
2 48-59
3 60-71
4 72-79
5 80-87
6 88-99
答案 1 :(得分:0)
import pandas as pd
# DataFrame containing the SAS format #
df_format = pd.DataFrame({'grp_code':[1,2,3,4,5,6,7],'grp_decode':['0-23','24-27','48-59','60-71','72-79','80-87','88-99']})
df_format = df_format.set_index('grp_code')
# DataFrame containing the source data #
df_data = pd.DataFrame({'age_grp_code':[1,2,3,4,5,6,2,1,7,3,2]})
# Apply the format decode in a new column #
df_data['age_grp_decode'] = df_data.replace({'age_grp_code': df_format['grp_decode']})
print(df_data)