2

所以我知道可以使用 convert_categoricals 参数读取 Stata 分类标签或值。

我正在寻找一种将熊猫数据框写入/导出到 Stata 并包含值标签的方法。但是我能找到的只是

data_label : str, optional对于数据集标签

或者

variable_labels : dict对于列名标签,

但对价值观本身没有任何影响。

4

2 回答 2

4

这是您的问题的答案。这可能不是您所期望的,因为我没有使用pd.to_Stata,而是在 Stata 16 上开发的 Python 集成。

下面的代码必须在 Stata 中执行(从版本 16 开始)。简而言之,我正在生成一个df将导出到 Stata 的 Pandas Data.Frame ()。ValueLabel.setLabelValue()诀窍是使用来自sfi库的功能将标签应用于值。

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

如果您想更好地理解上面代码背后的推理,这里是我用来学习它的参考资料。

  1. Stata/Python 集成第 9 部分:使用 Stata 函数接口将数据从 Python 复制到 Stata
  2. Stata/Python 集成第 8 部分:使用 Stata 函数接口将数据从 Stata 复制到 Python
于 2020-12-13T11:57:33.123 回答
1

与具有数字编码字符串值的 Stata 变量等效的 pandas 是 Categorical dtype。to_stata使用该方法导出分类列会将其导出。以Álvaro A. Gutiérrez Vargas为例:

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)

这将创建一个带有 Rank 变量的 Stata 数据集,编码为 0=Captain, 1=Soldier。可以使用Categorical.reorder_categories()or更改顺序Categorical.set_categories(),例如:

df['Rank'] = df['Rank'].cat.reorder_categories(['Soldier', 'Captain'], ordered=True)

现在,使用该方法导出to_stata将使用编码 0=Soldier,1=Captain。

但是没有办法指定自定义编码,所以如果你需要比 0 到最大编码更具体的东西,你应该使用Álvaro A. Gutiérrez Vargas的方法。

于 2020-12-14T09:11:40.470 回答