2017-09-04 1 views
-2

.dta를 DataFrame으로 열려고합니다. 하지만 오류가 나타납니다 : "ValueError : 열의 값 레이블 ...이 고유하지 않습니다. 반복되는 레이블은 다음과 같습니다."다음에 레이블이 두 번 열에 붙습니다.판다 스태타 (Stata to Pandas) : 반복되는 밸류 라벨이 있더라도?

stata의 정확한 값 레이블을 가진 다중 코드를 레이블링하는 것이 영리하지 않습니다. 내 결함이 아닙니다. 팬더는 반복 된 값 레이블을 허용하지 않습니다. (영리합니다).

하지만 난 (좋은) 솔루션을 알아낼 수 없습니다 : 이 있습니까 :

을 수행합니다. pandas로 데이터를 열고이 과정에서 double ("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"대신 "label (2)"를 사용하여 모든 반복 된 값 레이블의 이름을 바꾸는 것입니다. 는 그래,이 코드는 지금까지도 다소 지루 :

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 

나는 각 제안에 대한 행복! (STATA에서)

+0

여기서 재현 할 수있는 예는 없습니다. https://stackoverflow.com/help/mcve는 조언을 제공합니다. –

+0

좋아, 네가 맞아.이 경우에는별로 도움이되지 않을 것 같아. 예를 들어 데이터가 모든 사람들에게 더 높은 품질을 만들어 줄 것이다. 아프다. –

+0

나는 판다 사람이 아니기 때문에 도움이 가장 필요하다. 그러나 Stata 끝에서,'다중 레이블, gen (valuelabel)'다음에'label values ​​multilabel'이 뒤 따르는 것은 당신이 말한 값 라벨의 반복을 제거 할 것이다. . –

답변

0

는 문자열 변수의 값 레이블을두고 다음 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 개 이상의 변수가있는 데이터 집합이 있고 각 변수에 대해 값 레이블을 포함하는 추가 변수를 생성하는 것이 효과적인지 잘 모르겠습니다. 판다 (pandas)로 전송하기 위해, 지금까지 (지금까지) 그렇지 않습니다. 그들을 더 중요한 변수에 다시 연결할 수 있습니다. 그게 내가 값 레이블을 변경하려는 이유 : 11은 "oneone"이라는 레이블이 붙을 수 있고 22 개는 "twotwo"또는 11 개의 레이블을 붙일 수 있습니다. 22 개는 "oneone 또는 twowo (1) onone 또는 twotwo (2) ". –

+0

'도움말 numlabel'은 모호성을 제거하는 방법입니다. –

+0

완벽, "no repeatet value labels"대신 "disambiguate"라는 단어를 사용해야합니다. ;-) –

1

내 최종 솔루션 :

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 

당신에게 닉 감사합니다!

decode multilabel, gen(valuelabel) 
label values multilabel 

다음 반복 레이블 변수가있는 경우