但是出现了一个错误。"ValueError:列的值标签...不是唯一的。重复的标签是:"后面是在一列中出现两次的标签。
我知道在stata中用完全相同的值标签来标记多重代码是不聪明的(不是我的错:))。
经过一些研究,我知道pandas不会接受重复的值标签(这就是聪明之处)。
但我无法找出一个(好的)解决方案。
a. 用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-命令。
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 人赞同
至少从pandas 0.22开始,你可以将convert_categoricals=False
传递给read_stata
,它不会试图将数值映射到它们的定义中。
d = pd.read_stata('fooy_labels.dta', convert_categoricals=False)
你产生的数据框架将在问题列中有数字值。现在你可以按照你的意愿重新编码。
0 人赞同
如果你有一个重复标签的变量,那么
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'"
0 人赞同
我的最终解决方案(在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