2017-05-01 2 views
0

두 개의 data frames이 있는데이 두 키를 모두 UserId에있는 키로 병합하고 싶습니다. df1의 모든 행에 대해 df2에 일치하는 ID가없는 경우데이터 프레임을 왼쪽 일치 행의 기본 일치 항목과 병합

그러나, 나는 항상 df2에 존재하는 몇 가지 기본 병합 값, 특히 df2[df2.UserId == 0]을 설정합니다.

왼쪽으로 표시기를 병합 한 다음 왼쪽과 일치하지 않는 모든 행을 채운다 고 생각했지만 각 열을 구체적으로 지정하지 않고 df2의 내용을이 행에 설정하는 방법을 모르겠습니다.

res = df1.merge(df2, on=['UserId'], how='left', sort=False, indicator=True) 
res[res._merge == 'left_only'] = ... 

답변

0

이 결국 나를 위해 일한 것입니다 :

def extractDefault(resRow, df2): 
    defaultRow = df2[df2.UserId == 0)].iloc[0] 
    resDict = resRow.to_dict() 
    defaultDict = defaultRow.to_dict() 
    mergedDict = { **resDict, **defaultDict } 
    return mergedDict 
: 다음과 같은 추가적인 정의와

res = df1.merge(df2, on=['UserId'], how='left', sort=False, indicator=True) 

defaultDicts = [extractDefault(row, df2) for index, row in res.loc[res._merge == 'left_only'].iterrows()] 
defaultPd = pd.DataFrame(defaultDicts) 

res = res[res._merge == 'both'] 
res = res.append(defaultPd, ignore_index=False)[res.columns.tolist()] 
res.drop('_merge', axis=1, inplace=True)