2017-12-09 2 views
0

고유 한 GEO_ID와 각 GEO_ID에 대한 별도의 열 (6 개 중 1 개)에 속성 (FTYPE)이 있고 각 FTYPE에 대한 관련 길이가있는 데이터 프레임이 있습니다.Python Pandas : 병합, 조인, 연결

df 

    FID GEO_ID FTYPE Length_km 

0 1400000US06001400100 428 3.291467766 

1 1400000US06001400100 460 7.566487367 

2 1400000US06001401700 460 0.262190266 

3 1400000US06001401700 566 10.49899202 

4 1400000US06001403300 428 0.138171389 

5 1400000US06001403300 558 0.532913513 

는 어떻게 각 행은 고유 GEO_ID을 만들 수 FTYPE_Length 및 6 새 열 (즉, 행이 FTYPE가있는 경우 표시하기 위해 1과 0) FTYPE 6 새 열을 어떻게해야합니까?

import pandas as pd 
fname = "filename.csv" 
df = pd.read_csv(fname) 
nhd = [334, 336, 420, 428, 460, 558, 556] 
df1 = df.loc[df['FTYPE']==nhd[0]] 
df2 = df.loc[df['FTYPE']==nhd[1]] 
df3 = df.loc[df['FTYPE']==nhd[2]] 
df4 = df.loc[df['FTYPE']==nhd[3]] 
df5 = df.loc[df['FTYPE']==nhd[4]] 
df6 = df.loc[df['FTYPE']==nhd[5]] 
df7 = df.loc[df['FTYPE']==nhd[6]] 
df12 = df1.merge(df2, how='left', left_on='GEO_ID', right_on='GEO_ID') 
df23 = df12.merge(df3,how='left', left_on='GEO_ID', right_on='GEO_ID') 
df34 = df23.merge(df4,how='left', left_on='GEO_ID', right_on='GEO_ID') 
df45 = df34.merge(df5,how='left', left_on='GEO_ID', right_on='GEO_ID') 
df56 = df45.merge(df6,how='left', left_on='GEO_ID', right_on='GEO_ID') 
df67 = df56.merge(df7,how='left', left_on='GEO_ID', right_on='GEO_ID') 
cols = [0,4,7,10,13,16,19] 
df67.drop(df67.columns[cols],axis=1,inplace=True) 
df67.columns =['GEO_ID','334','len_334','336','len_336','420','len_420','428','len_428','460','len_460','558','len_558','566','len_566'] 

이 같은 일을

FID GEO_ID FTYPE_428 FTYPE_428_length FTYPE_460 FTYPE_460_length 
0 1400000US06001400100 1 3.291467766 1 7.566487367 

지금까지 내가 무엇을 시도하는 것은 :

나는 나의 새로운 dataframe (6 FTYPE-S와)과 같은 구조를 갖고 싶어 그러나이 방법은 처음 두 개의 FTYPE이있는 행으로 줄이기 때문에 문제가됩니다. 한 번에 여러 열을 병합하는 방법이 있습니까?

그것의 아마 쉽게는 루프를 작성하고 각 행을 가서 이런 식으로 값을 입력하는 조건을 사용 :

nhd = [334, 336, 420, 428, 460, 558, 556] 
for x in nhd: 
    df[str(x)] = None 
    df["length_"+str(x)] = None 
df.head() 
for geoid in df["GEO_ID"]: 
    #print geoid 
    for x in nhd: 
     df.ix[(df['FTYPE']==x) & (df['GEO_ID'] == geoid)][str(nhd)] = 1 

을하지만 너무 많은 시간이 걸리고 아마 한 라이너에있다 팬더도 똑같이해야합니다.

이 문제에 대한 도움이 필요하십니까?

감사합니다, 솔로몬

답변

1

나는 확실히 당신의 _length 열 점을 보지 않는다 : 그들은 단지 여부 일치하는 값과 동일한 정보를 갖고있는 것 같다 그들이 중복 만드는, null 또는 없습니다. 그래도 쉽게 만들 수 있습니다.

우리가 주장한다면이 내용을 한 줄로 채울 수 있지만, 그 요점은 무엇입니까? 이것은 코드 늑대가 아니라 SO입니다.

In [49]: final 
Out[49]: 
         FTYPE_334 FTYPE_334_length FTYPE_428 \ 
GEO_ID               
1400000US06001400100  NaN     0 3.291468 
1400000US06001401700  NaN     0  NaN 
1400000US06001403300  NaN     0 0.138171 
1400000US06001403400 0.04308     1  NaN 

         FTYPE_428_length FTYPE_460 FTYPE_460_length \ 
GEO_ID                 
1400000US06001400100     1 7.566487     1 
1400000US06001401700     0 0.262190     1 
1400000US06001403300     1  NaN     0 
1400000US06001403400     0  NaN     0 

         FTYPE_558 FTYPE_558_length FTYPE_566 FTYPE_566_length 
GEO_ID                   
1400000US06001400100  NaN     0  NaN     0 
1400000US06001401700  NaN     0 10.498992     1 
1400000US06001403300 0.532914     1 1.518864     1 
1400000US06001403400  NaN     0  NaN     0 
+0

대 (5 별개의 FTYPEs이있는, 사용자의 입력 데이터를 사용하여) 저를 제공

df = df.pivot(index="GEO_ID", columns="FTYPE", values="Length_km") df.columns = "FTYPE_" + df.columns.astype(str) has_value = df.notnull().astype(int) has_value.columns += '_length' final = pd.concat([df, has_value], axis=1).sort_index(axis='columns') 

: 그래서 내가 좋아하는 뭔가를 할 수 있습니다! 빠른 답변 주셔서 감사합니다. 정보가 중복되어 길이 열을 삭제할 수 있습니다. – solonome