2014-01-17 7 views
2

나는 아래와 같이 두 개의 팬더 데이터 프레임을 연결합니다.팬더 : 고유 한 값으로 조건부 연결

part1 = pd.DataFrame({'id' :[100,200,300,400,500], 
        'amount': np.random.randn(5) 
        }) 

part2 = pd.DataFrame({'id' :[700,100,800,500,300], 
        'amount': np.random.randn(5) 
        }) 

concatenated = pd.concat([part1, part2], axis=0) 
    amount id 
0 -0.458653 100 
1 2.172348 200 
2 0.072494 300 
3 -0.253939 400 
4 -0.061866 500 
0 -1.187505 700 
1 -0.810784 100 
2 0.321881 800 
3 -1.935284 500 
4 -1.351507 300 

id 이미 part1에 나타나지 않는 경우 part2의 행에만 concatenated에 포함되도록 내가 작업을 제한 할 수 있습니까? 어떤면에서는 id 열을 세트로 처리하려고합니다.

concat() 중에 이것을 수행 할 수 있습니까, 아니면 더 후 처리 단계입니까?

는 이 예를 들어

원하는 출력은 다음과 같습니다

concatenated_desired 
    amount id 
0 -0.458653 100 
1 2.172348 200 
2 0.072494 300 
3 -0.253939 400 
4 -0.061866 500 
0 -1.187505 700 
2 0.321881 800 

답변

2

전화 drop_duplicates()concat() 후 :

part1 = pd.DataFrame({'id' :[100,200,300,400,500], 
        'amount': np.arange(5) 
        }) 

part2 = pd.DataFrame({'id' :[700,100,800,500,300], 
        'amount': np.random.randn(5) 
        }) 

concatenated = pd.concat([part1, part2], axis=0) 
print concatenated.drop_duplicates(cols="id") 
+0

[manual] (http://pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.drop_duplicates.html)을 확인했지만 여전히 확실하지 않습니다. 이렇게하면 주어진 'id'의 첫 번째 발생 (행)을 유지할 수 있습니까? – Rhubarb

+0

예, take_last 인수가 있습니다. 부울 값, 기본값은 False입니다. 마지막으로 관찰 된 행을 연속으로 가져옵니다. 기본값은 첫 번째 행입니다. 그래서 당신은 첫 번째 또는 마지막으로 유지할 것을 선택할 수 있습니다. – HYRY

+0

그래서'take_last = False' (기본값)는'take_first'를 의미합니까? – Rhubarb

1

ID를 계산은 PART1 지금

In [28]: 
diff = part2.ix[~part2['id'].isin(part1['id'])] 
diff 

Out[28]: 
    amount id 
0 -2.184038 700 
2 -0.070749 800 

아니다 CONCAT

In [29]: 
concatenated = pd.concat([part1, diff], axis=0) 
concatenated 

Out[29]: 
    amount id 
0 -2.240625 100 
1 -0.348184 200 
2 0.281050 300 
3 0.082460 400 
4 -0.045416 500 
0 -2.184038 700 
2 -0.070749 800 
또한 하나의 라이너이를 넣을 수 있습니다

:

concatenated = pd.concat([part1, part2.ix[~part2['id'].isin(part1['id'])]], axis=0) 
2

열이 id 인 경우 색인으로 사용하십시오. 실제 색인으로 조작을 수행하면 작업이 더 쉬워집니다. 여기에 당신은 당신이 찾고있는 무엇 않는 combine_first을 사용할 수 있습니다에 대한 당신이 정말로, 그 인덱스를 얻을 후에 다시 설정할 필요가 없다 경우

part1 = part1.set_index('id') 

part2 = part2.set_index('id') 

part1.combine_first(p2) 
Out[38]: 
     amount 
id   
100 1.685685 
200 -1.895151 
300 -0.804097 
400 0.119948 
500 -0.434062 
700 0.215255 
800 -0.031562 

:

part1.combine_first(p2).reset_index() 
Out[39]: 
    id amount 
0 100 1.685685 
1 200 -1.895151 
2 300 -0.804097 
3 400 0.119948 
4 500 -0.434062 
5 700 0.215255 
6 800 -0.031562 
관련 문제