2017-12-25 2 views
0

제 의도는 레이블을 바꾸는 것입니다. 사전을 사용하여 데이터 프레임에 매핑하는 방법에 대해 알아 냈습니다. 이를 위해 필자는 먼저 필요한 필드를 추출하고 사전을 만들어지도 함수에 입력했습니다. 다음팬더 맵 NaN 만들기

내 프로그램은 :

Id,Help in household,Maths,Reading,Science,Social 
11011001001,4,20.37,,27.78, 
11011001002,3,12.96,,38.18, 
11011001003,4,27.78,70,, 
11011001004,4,,56.67,,36 
11011001005,1,,,14.55,8.33 
11011001006,4,,23.33,,30 
11011001007,4,40.74,70,, 
11011001008,3,,26.67,,22.92 

의도 된 결과는 다음과 같이

Column,Name,Level,Rename 
Help in household,Every day,4,Every day 
Help in household,Never,1,Never 
Help in household,Once a month,2,Once a month 
Help in household,Once a week,3,Once a week 
State,AN,AN,Andaman & Nicobar 
State,AP,AP,Andhra Pradesh 
State,AR,AR,Arunachal Pradesh 
State,BR,BR,Bihar 
State,CG,CG,Chattisgarh 
State,CH,CH,Chandigarh 
State,DD,DD,Daman & Diu 
State,DL,DL,Delhi 
State,DN,DN,Dadra & Nagar Haveli 
State,GA,GA,Goa 
State,GJ,GJ,Gujarat 
State,HP,HP,Himachal Pradesh 
State,HR,HR,Haryana 
State,JH,JH,Jharkhand 
State,JK,JK,Jammu & Kashmir 
State,KA,KA,Karnataka 
State,KL,KL,Kerala 
State,MG,MG,Meghalaya 
State,MH,MH,Maharashtra 
State,MN,MN,Manipur 
State,MP,MP,Madhya Pradesh 
State,MZ,MZ,Mizoram 
State,NG,NG,Nagaland 
State,OR,OR,Orissa 
State,PB,PB,Punjab 
State,PY,PY,Pondicherry 
State,RJ,RJ,Rajasthan 
State,SK,SK,Sikkim 
State,TN,TN,Tamil Nadu 
State,TR,TR,Tripura 
State,UK,UK,Uttarakhand 
State,UP,UP,Uttar Pradesh 
State,WB,WB,West Bengal 

내 dat.csv는 다음과 같이

factor_name = 'Help in household' 
df = pd.read_csv('dat.csv') 
labels = pd.read_csv('labels.csv') 
fact_df = labels.loc[labels['Column'] == factor_name] 
fact_dict = dict(zip(fact_df['Level'], fact_df['Rename'])) 
print df.index.to_series().map(fact_dict) 

내 labels.csv 인 다음과 같습니다 :

4 Every day 
1 Never 
2 Once a month 
3 Once a week 

매핑이 실패합니다. 결과는 항상 내가 원하지 않는 NaN을 표시합니다. 아무도 그 이유를 말할 수 있습니까?

In [140]: df['Help in household'] \ 
      .astype(str) \ 
      .map(labels.loc[labels['Column']=='Help in household',['Level','Rename']] 
         .set_index('Level')['Rename']) 
Out[140]: 
0  Every day 
1 Once a week 
2  Every day 
3  Every day 
4   Never 
5  Every day 
6  Every day 
7 Once a week 
Name: Help in household, dtype: object 

또한 merge 사용을 고려할 수 있습니다 :

+1

당신이 원하는 (결과) 데이터 세트를 게시 할 수 있습니까? – MaxU

+0

@MaxU 나는 그것을 추가했다. –

답변

1

이 시도

In [147]: df.assign(Level=df['Help in household'].astype(str)) \ 
      .merge(labels.loc[labels['Column']=='Help in household',['Level','Rename']], 
        on='Level') 
Out[147]: 
      Id Help in household Maths Reading Science Social Level  Rename 
0 11011001001     4 20.37  NaN 27.78  NaN  4 Every day 
1 11011001003     4 27.78 70.00  NaN  NaN  4 Every day 
2 11011001004     4 NaN 56.67  NaN 36.00  4 Every day 
3 11011001006     4 NaN 23.33  NaN 30.00  4 Every day 
4 11011001007     4 40.74 70.00  NaN  NaN  4 Every day 
5 11011001002     3 12.96  NaN 38.18  NaN  3 Once a week 
6 11011001008     3 NaN 26.67  NaN 22.92  3 Once a week 
7 11011001005     1 NaN  NaN 14.55 8.33  1  Never 
+1

@EchchamaNayak, 샘플 DF에서 State 컬럼을 찾을 수 없습니다 ... __reproducible__ 데이터 세트와 더 일반적인 데이터 세트를 게시하는 것을 고려하십시오 ... – MaxU

+1

안녕하세요, 다시 한번 감사드립니다. 두 번째 해결책은'drop duplicates '가 사용되었을 때 더 잘 작동합니다. 그렇지 않으면'set_index' 함수가 재 색인 생성 오류를 발생시킵니다 –

+0

@EchchamaNayak, 예,'drop_duplicates'는이 경우에 의미가 있습니다. – MaxU