Stata to Pandas:即使有重复的价值标签?

时间:2017-09-04 12:54:28

标签: python pandas stata labels

我尝试打开.dta作为DataFrame。 但是会出现一个错误:“ValueError:列的值标签不是唯一的。重复的标签是:”后面跟着标签两次的标签。

我知道在stata中使用完全相同的值标签标记乘法代码并不聪明(不是我的错:)) 经过一些研究我知道,大熊猫不会接受重复的价值标签(这很聪明)。

但我无法找到一个(好的)解决方案: 是吗:

一个。用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')

湾一个快速简单的方法来告诉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

我为每个建议感到高兴!

3 个答案:

答案 0 :(得分:1)

我的最终解决方案(在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

谢谢你尼克!

答案 1 :(得分:1)

如果您有一个带有重复标签的变量,那么

decode multilabel, gen(valuelabel)
label values multilabel

将值标签放在字符串变量中,然后撤消multilabel值与先前附加的值标签的关联。我不知道你还需要做什么,以及为什么你要做其他事情。您现在拥有与以前相同的信息。我不知道大熊猫是否会忽略价值标签的定义。

为了完整性,这里有一种方法可以找出哪些变量的值标签与数值一一对应。

* 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'" 

答案 2 :(得分:1)

由于熊猫数至少为0.22,因此您可以将convert_categoricals=False传递给read_stata,并且不会尝试将数值映射到它们的定义。

d = pd.read_stata('fooy_labels.dta', convert_categoricals=False)

您得到的DataFrame在问题列中将具有数值。现在,您可以根据需要对其进行重新编码。