有没有办法在 Python 内保存 Stata 分类数据的值标签?
Is there a way to save value labels for Stata categorical data within Python?
所以我知道可以使用 convert_categoricals 参数读取 Stata 分类标签或值。
我正在寻找一种方法将 write/export 一个 pandas 数据框发送到 Stata 并包含值标签。但是我能找到的只有
data_label : str, optional
数据集标签
或
variable_labels : dict
用于列名标签,
但值本身没有任何意义。
这是对您问题的回答。这可能不是您所期望的,因为我没有使用 pd.to_Stata
,而是在 Stata 16 上开发的 Python 集成。
下面的代码必须在 Stata 中执行(从版本 16 开始)。简而言之,我正在生成一个 Pandas Data.Frame (df
),我将导出到 Stata。诀窍是使用来自 sfi
库的 ValueLabel.setLabelValue()
功能将标签应用于值。
clear all
python:
from sfi import ValueLabel, Data
import pandas as pd
data = [['Eren Jaeger', 15, 1, 'Soldier' ] , ['Mikasa Ackerman', 14, 1, 'Soldier'], ['Armin Arlert', 14, 1 , 'Soldier'],['Levi Ackerman', 30, 2, 'Captain']]
#creating DataFrame
df = pd.DataFrame(data, columns = ['Name', 'Age', 'Rank_num', 'Rank'])
## Name Age Rank_num Rank
##0 Eren Jaeger 15 1 Soldier
##1 Mikasa Ackerman 14 1 Soldier
##2 Armin Arlert 14 1 Soldier
##3 Levi Ackerman 30 2 Captain
# Set number of observations in Stata
Data.setObsTotal(len(df))
#Create variables on Stata (from Python)
Data.addVarStr("Name",10)
Data.addVarDouble("Age")
Data.addVarInt("Rank_num")
#Store the content of "df" object from Python to Stata
Data.store("Name", None, df['Name'], None)
Data.store("Age", None, df['Age'], None)
Data.store("Rank_num", None, df['Rank_num'], None)
# HERE is where I solve your question!
# 1) Create the labels
ValueLabel.setLabelValue('rank_num_LABEL', 1, 'Soldier')
ValueLabel.setLabelValue('rank_num_LABEL', 2, 'Captain')
ValueLabel.getValueLabels('rank_num_LABEL')
# 2) Attach the labels to the created variable
#Attach the created label
ValueLabel.setVarValueLabel('Rank_num', 'rank_num_LABEL')
end
br
* At the end, you will see the following on the Stata browser
* Name Age Rank_num
* Eren Jaeger 15 Soldier
* Mikasa Ackerman 14 Soldier
* Armin Arlert 14 Soldier
* Levi Ackerman 30 Captain
如果您想更好地理解上面代码背后的原因,这里是我用来学习它的参考资料。
相当于具有数字编码字符串值的 Stata 变量的 pandas 是分类数据类型。使用 to_stata
方法导出分类列将按原样导出。以为例:
data = [['Eren Jaeger', 15, 1, 'Soldier' ] , ['Mikasa Ackerman', 14, 1, 'Soldier'], ['Armin Arlert', 14, 1 , 'Soldier'],['Levi Ackerman', 30, 2, 'Captain']]
df = pd.DataFrame(data, columns = ['Name', 'Age', 'Rank_num', 'Rank'])
df['Rank'] = df['Rank'].astype('category')
df.to_stata('YOUR/PATH/HERE', write_index=False)
这将创建一个 Stata 数据集,其 Rank 变量编码为 0=Captain,1=Soldier。
可以使用 Categorical.reorder_categories()
或 Categorical.set_categories()
更改顺序,例如:
df['Rank'] = df['Rank'].cat.reorder_categories(['Soldier', 'Captain'], ordered=True)
现在,使用 to_stata
方法导出将使用编码 0=Soldier,1=Captain。
虽然没有办法指定自定义编码,所以如果您需要比 0 到最大编码更具体的东西,您应该使用 .
的方法
所以我知道可以使用 convert_categoricals 参数读取 Stata 分类标签或值。
我正在寻找一种方法将 write/export 一个 pandas 数据框发送到 Stata 并包含值标签。但是我能找到的只有
data_label : str, optional
数据集标签
或
variable_labels : dict
用于列名标签,
但值本身没有任何意义。
这是对您问题的回答。这可能不是您所期望的,因为我没有使用 pd.to_Stata
,而是在 Stata 16 上开发的 Python 集成。
下面的代码必须在 Stata 中执行(从版本 16 开始)。简而言之,我正在生成一个 Pandas Data.Frame (df
),我将导出到 Stata。诀窍是使用来自 sfi
库的 ValueLabel.setLabelValue()
功能将标签应用于值。
clear all
python:
from sfi import ValueLabel, Data
import pandas as pd
data = [['Eren Jaeger', 15, 1, 'Soldier' ] , ['Mikasa Ackerman', 14, 1, 'Soldier'], ['Armin Arlert', 14, 1 , 'Soldier'],['Levi Ackerman', 30, 2, 'Captain']]
#creating DataFrame
df = pd.DataFrame(data, columns = ['Name', 'Age', 'Rank_num', 'Rank'])
## Name Age Rank_num Rank
##0 Eren Jaeger 15 1 Soldier
##1 Mikasa Ackerman 14 1 Soldier
##2 Armin Arlert 14 1 Soldier
##3 Levi Ackerman 30 2 Captain
# Set number of observations in Stata
Data.setObsTotal(len(df))
#Create variables on Stata (from Python)
Data.addVarStr("Name",10)
Data.addVarDouble("Age")
Data.addVarInt("Rank_num")
#Store the content of "df" object from Python to Stata
Data.store("Name", None, df['Name'], None)
Data.store("Age", None, df['Age'], None)
Data.store("Rank_num", None, df['Rank_num'], None)
# HERE is where I solve your question!
# 1) Create the labels
ValueLabel.setLabelValue('rank_num_LABEL', 1, 'Soldier')
ValueLabel.setLabelValue('rank_num_LABEL', 2, 'Captain')
ValueLabel.getValueLabels('rank_num_LABEL')
# 2) Attach the labels to the created variable
#Attach the created label
ValueLabel.setVarValueLabel('Rank_num', 'rank_num_LABEL')
end
br
* At the end, you will see the following on the Stata browser
* Name Age Rank_num
* Eren Jaeger 15 Soldier
* Mikasa Ackerman 14 Soldier
* Armin Arlert 14 Soldier
* Levi Ackerman 30 Captain
如果您想更好地理解上面代码背后的原因,这里是我用来学习它的参考资料。
相当于具有数字编码字符串值的 Stata 变量的 pandas 是分类数据类型。使用 to_stata
方法导出分类列将按原样导出。以
data = [['Eren Jaeger', 15, 1, 'Soldier' ] , ['Mikasa Ackerman', 14, 1, 'Soldier'], ['Armin Arlert', 14, 1 , 'Soldier'],['Levi Ackerman', 30, 2, 'Captain']]
df = pd.DataFrame(data, columns = ['Name', 'Age', 'Rank_num', 'Rank'])
df['Rank'] = df['Rank'].astype('category')
df.to_stata('YOUR/PATH/HERE', write_index=False)
这将创建一个 Stata 数据集,其 Rank 变量编码为 0=Captain,1=Soldier。
可以使用 Categorical.reorder_categories()
或 Categorical.set_categories()
更改顺序,例如:
df['Rank'] = df['Rank'].cat.reorder_categories(['Soldier', 'Captain'], ordered=True)
现在,使用 to_stata
方法导出将使用编码 0=Soldier,1=Captain。
虽然没有办法指定自定义编码,所以如果您需要比 0 到最大编码更具体的东西,您应该使用