如何在python中应用sas如格式化?

时间:2016-07-07 10:22:53

标签: python pandas

我正在尝试在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 +'分别与他们的频率。 (注意:我不想更改原始数据)。

我检查了一些格式化选项,但其中大多数似乎是浮点数等。我该如何为打印执行此自定义格式设置?

由于

2 个答案:

答案 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)