Stata to Pandas: 即使有重复的Value Labels?
Stata to Pandas: even if there are repeated Value Labels?
我尝试打开一个 .dta 作为 DataFrame。
但是出现错误:"ValueError: Value labels for column ... are not unique. The repeated labels are:" 后跟在一列中出现两次的标签。
我知道在 stata 中用完全相同的值标签标记乘法代码并不聪明(不是我的错:))
经过一些研究我知道,pandas 不会接受重复的值标签(这很聪明)。
但我想不出一个(好的)解决方案:
有没有:
一个。使用 pandas 打开数据并在此过程中将双打重命名(如 "label" 为 "label(2)")的一种平滑方法?
数据如下(括号中的值标签):
| multilabel
1 | 11 (oneone or twotwo)
2 | 22 (oneone or twotwo)
3 | 33 (other-label-which-is-unique)
到目前为止我的代码:
import pandas as pd
#followed by any option that delivers this solution:
dataframe = pd.read_stata('file.dta')
或
b。一种告诉 Stata 的快速简单方法:只需将所有重复的值标签重命名为 "label(2)" 而不是 "label"?
是的,到目前为止的代码也很无聊:
use "file.dta"
*followed by a loop wich finds repeated labels and changes them
save "file.dta", replace
是的,有很多重复的值标签需要一个一个地检查。
这里是 Stata-Commands 生成的最小示例:
set obs 1
generate var1 = 1 in 1
set obs 2
replace var1 = 2 in 2
set obs 3
replace var1 = 3 in 3
generate var2 = 11 in 1
replace var2 = 22 in 2
replace var2 = 33 in 3
rename var2 multilabel
label define labelrepeat 11 "oneone or twotwo" 22 "oneone or twotwo"
label values multilabel labelrepeat
我很高兴每一个建议!
我的最终解决方案(在 Stata 中):
clear
use "file.dta"
*Find out which duplicated value labels there are
labelbook, length(12)
return list, all
*r(nuniq) contains the not-unique-values
*on all variables in r(nuniq) use the numlabels command
numlabel `r(nuniq)', add
*Look at the not unique value labels again:
labelbook, length(12)
return list, all
save "file2.dta", replace
谢谢尼克!
如果您有一个带有重复标签的变量,那么
decode multilabel, gen(valuelabel)
label values multilabel
将值标签放入字符串变量中,然后取消 multilabel
值与先前附加的值标签的关联。我不知道你还需要做什么,因此你为什么要做其他事情。您现在拥有与以前相同的信息。不知道pandas会不会忽略值标签的定义。
为了完整起见,这里有一种方法可以找出哪些变量的值标签与数值不一一对应。
* your sandbox, simplified and extended
clear
set obs 3
generate var1 = _n
generate multilabel = 11 * _n
label define labelrepeat 11 "oneone or twotwo" 22 "oneone or twotwo"
label values multilabel labelrepeat
label define var1 1 "frog" 2 "toad" 3 "newt"
label val var1 var1
* my code
local bad
ds *, has(vallabel)
quietly foreach v in `r(varlist)' {
tempvar decoded diff
decode `v', gen(`decoded')
bysort `decoded' (`v') : gen `diff' = `v'[1] != `v'[_N] & !missing(`decoded')
count if `diff'
if r(N) > 0 local bad `bad' `v'
drop `decoded' `diff'
}
di "`bad'"
至少从 pandas 0.22 开始,您可以将 convert_categoricals=False
传递给 read_stata
,它不会尝试将数值映射到它们的定义。
d = pd.read_stata('fooy_labels.dta', convert_categoricals=False)
您生成的 DataFrame 将具有问题列中的数值。您现在可以根据需要重新编码。
我尝试打开一个 .dta 作为 DataFrame。 但是出现错误:"ValueError: Value labels for column ... are not unique. The repeated labels are:" 后跟在一列中出现两次的标签。
我知道在 stata 中用完全相同的值标签标记乘法代码并不聪明(不是我的错:)) 经过一些研究我知道,pandas 不会接受重复的值标签(这很聪明)。
但我想不出一个(好的)解决方案: 有没有:
一个。使用 pandas 打开数据并在此过程中将双打重命名(如 "label" 为 "label(2)")的一种平滑方法?
数据如下(括号中的值标签):
| multilabel
1 | 11 (oneone or twotwo)
2 | 22 (oneone or twotwo)
3 | 33 (other-label-which-is-unique)
到目前为止我的代码:
import pandas as pd
#followed by any option that delivers this solution:
dataframe = pd.read_stata('file.dta')
或
b。一种告诉 Stata 的快速简单方法:只需将所有重复的值标签重命名为 "label(2)" 而不是 "label"? 是的,到目前为止的代码也很无聊:
use "file.dta"
*followed by a loop wich finds repeated labels and changes them
save "file.dta", replace
是的,有很多重复的值标签需要一个一个地检查。
这里是 Stata-Commands 生成的最小示例:
set obs 1
generate var1 = 1 in 1
set obs 2
replace var1 = 2 in 2
set obs 3
replace var1 = 3 in 3
generate var2 = 11 in 1
replace var2 = 22 in 2
replace var2 = 33 in 3
rename var2 multilabel
label define labelrepeat 11 "oneone or twotwo" 22 "oneone or twotwo"
label values multilabel labelrepeat
我很高兴每一个建议!
我的最终解决方案(在 Stata 中):
clear
use "file.dta"
*Find out which duplicated value labels there are
labelbook, length(12)
return list, all
*r(nuniq) contains the not-unique-values
*on all variables in r(nuniq) use the numlabels command
numlabel `r(nuniq)', add
*Look at the not unique value labels again:
labelbook, length(12)
return list, all
save "file2.dta", replace
谢谢尼克!
如果您有一个带有重复标签的变量,那么
decode multilabel, gen(valuelabel)
label values multilabel
将值标签放入字符串变量中,然后取消 multilabel
值与先前附加的值标签的关联。我不知道你还需要做什么,因此你为什么要做其他事情。您现在拥有与以前相同的信息。不知道pandas会不会忽略值标签的定义。
为了完整起见,这里有一种方法可以找出哪些变量的值标签与数值不一一对应。
* your sandbox, simplified and extended
clear
set obs 3
generate var1 = _n
generate multilabel = 11 * _n
label define labelrepeat 11 "oneone or twotwo" 22 "oneone or twotwo"
label values multilabel labelrepeat
label define var1 1 "frog" 2 "toad" 3 "newt"
label val var1 var1
* my code
local bad
ds *, has(vallabel)
quietly foreach v in `r(varlist)' {
tempvar decoded diff
decode `v', gen(`decoded')
bysort `decoded' (`v') : gen `diff' = `v'[1] != `v'[_N] & !missing(`decoded')
count if `diff'
if r(N) > 0 local bad `bad' `v'
drop `decoded' `diff'
}
di "`bad'"
至少从 pandas 0.22 开始,您可以将 convert_categoricals=False
传递给 read_stata
,它不会尝试将数值映射到它们的定义。
d = pd.read_stata('fooy_labels.dta', convert_categoricals=False)
您生成的 DataFrame 将具有问题列中的数值。您现在可以根据需要重新编码。