添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
但是出现了一个错误。"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 个评论
我在这里没有看到一个可重复的例子。stackoverflow.com/help/mcve给予建议。
好吧,你是对的,即使我认为在这种情况下,它不会有太大的帮助,有一个例子数据将为大家创造更高的质量。
我不是潘达人,这是你最需要帮助的地方,但从Stata的角度来看,decode multilabel, gen(valuelabel)后面的label values multilabel会消除你说的价值标签的重复问题。
python
pandas
stata
label
Big.Joe
Big.Joe
发布于 2017-09-04
3 个回答
Kim Ruhl
Kim Ruhl
发布于 2017-09-04
已采纳
0 人赞同

至少从pandas 0.22开始,你可以将convert_categoricals=False传递给read_stata,它不会试图将数值映射到它们的定义中。

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

你产生的数据框架将在问题列中有数字值。现在你可以按照你的意愿重新编码。

Nick Cox
Nick Cox
发布于 2017-09-04
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'" 
    
谢谢你,我把这个标记为到目前为止最好的解决方案。但是我有一个有1000多个变量的数据集,我不确定为每个变量生成一个包含价值标签的额外变量是否有效,只是把它们转移到pandas,在那里我(直到现在)都不能把它们重新连接到这些变量上。这就是为什么我想改变价值标签的原因。11可以标为 "one",22可以标为 "twotwo",或者(如我的例子)11可以标为 "one or twowo(1)",22可以标为 "onone or twotwo(2)"。
替换代码0】的方式来消除歧义。
完美,我应该使用 "消除歧义 "一词,而不是谈论 "没有重复的价值标签";-)
Big.Joe
Big.Joe
发布于 2017-09-04
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