2017-09-04 98 views
-2

我嘗試打開.dta作爲DataFrame。 但出現一個錯誤:「ValueError:Column ...的值標籤不是唯一的,重複的標籤是:」後面跟着一個標籤,至少兩列標籤。Stata to Pandas:即使有重複的價值標籤?

我知道標籤多重代碼與stata中完全相同的值標籤不是很聰明(不是我的錯:)) 經過一些研究,我知道,熊貓不會接受重複的價值標籤(這是聰明的)。

但我不能想出一個(好)的解決方案: 有:

一個。在這個過程中,用熊貓打開數據的平滑方式,只需重命名雙打(如「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-命令產生一個最小的例子:

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 

我很高興每個建議!

+0

我在這裏看不到一個可重複的例子。 https://stackoverflow.com/help/mcve提供建議。 –

+0

好吧,你是對的,即使我認爲在這種情況下,它不會幫助太多,有一個例子 - 數據會爲每個人創造更高的質量。 SRY。 –

+0

我不是一個熊貓人,這是你最需要幫助的地方,但是從Stata的末尾開始,'解碼多標籤,gen(valuelabel)'後跟'label multilabel'標籤值將刪除你認爲有問題的值標籤的重複。 –

回答

0

如果你有重複的標籤一個變量,然後

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'" 
+0

感謝尼克,我將此標記爲目前爲止的最佳解決方案。但我有一個包含1000多個變量的數據集,並且我不確定是否有效地爲每個變量生成一個包含值標籤的附加變量,只是將它們轉移到熊貓,我在哪裏(到現在)還沒有能夠將它們重新附加到這些變量。這就是爲什麼我想改變價值標籤:11可以被標註爲「oneone」,22可以被標註爲「twotwo」或者(如在我的例子中)11可以被標註爲「oneone或twowo(1)」,並且22可以被試用「 onone或twotwo(2)「。 –

+0

'幫助numlabel'的方式來消除歧義。 –

+0

完美,我應該使用「消歧義」一詞而不是「沒有repeatet價值標籤」;-) –

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 

謝謝尼克!