【问题标题】:Stata to Pandas: even if there are repeated Value Labels?Stata to Pandas:即使有重复的值标签?
【发布时间】:2017-09-04 12:54:27
【问题描述】:

我尝试打开一个 .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')

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

我对每个建议都很满意!

【问题讨论】:

  • 我在这里看不到可重现的示例。 stackoverflow.com/help/mcve 提供建议。
  • 好吧,你是对的,即使我认为在这种情况下它不会有太大帮助,拥有一个示例数据将为每个人创造更高的质量。对不起。
  • 我不是 Pandas 人,这是您最需要帮助的地方,但从 Stata 端,decode multilabel, gen(valuelabel) 后跟 label values multilabel 将删除您说有问题的重复值标签。

标签: python pandas stata labels


【解决方案1】:

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

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

您生成的 DataFrame 将在问题列中包含数值。您现在可以根据需要重新编码。

【讨论】:

    【解决方案2】:

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

    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 多个变量的数据集,我不确定为这些变量中的每一个生成一个包含值标签的附加变量是否有效,只是为了将它们转移到我所在的熊猫(直到现在)不是能够将它们重新附加到它们的变量上。这就是为什么我要更改值标签的原因:11 可以标记为“oneone”,22 可以标记为“twotwo”,或者(如我的示例中)11 可以标记为“oneone or twowo(1)”,22 可以标记为“ onone or twotwo(2)"。
    • help numlabel 用于消除歧义。
    • 完美,我应该使用“消除歧义”这个词而不是谈论“没有重复值标签”;-)
    【解决方案3】:

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

    谢谢尼克!

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多