2014-01-17 117 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 

如何限制動作,以使在part2行只包含在concatenated如果該行id未出現在part1?在某種程度上,我想將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

我查了[手冊](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不是在第一部分

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