2013-09-23 28 views
1

我拖曳或三個具有重複行的DataFrame。Python/Pandas從DataFrame中篩選出唯一的行

In [31]: df1 
Out[31]: 
    member   time 
0  0 2009-09-30 12:00:00 
1  0 2009-09-30 18:00:00 
2  0 2009-10-01 00:00:00 
3  1 2009-09-30 12:00:00 
4  1 2009-09-30 18:00:00 
5  2 2009-09-30 12:00:00 
6  3 2009-09-30 12:00:00 
... 

In [32]: df2 
Out[32]: 
    member   time 
0  0 2009-09-30 12:00:00 
1  0 2009-09-30 18:00:00 
3  1 2009-09-30 12:00:00 
4  2 2009-09-30 12:00:00 
5  2 2009-09-30 18:00:00 
6  2 2009-10-01 00:00:00 
... 

我想篩選出具有DF1和DF2「成員」和「時間」的獨特價值的行,並得到一個只有具有「成員」的共同價值觀行的數據幀和「時間」在df1和df2中,即

In [33]: df_duplicated_1_and_2 
Out[33]: 
    member   time 
0  0 2009-09-30 12:00:00 
1  0 2009-09-30 18:00:00 
3  1 2009-09-30 12:00:00 
4  2 2009-09-30 12:00:00 
... 

有沒有一種高效優雅的方式來做到這一點?

更新如果可能,我想不是一個新的合併的DataFrame,而是一個過濾的DataFrame。例如,

In [34]: df1 
Out[34]: 
    member   time   value 
0  0 2009-09-30 12:00:00 a 
1  0 2009-09-30 18:00:00 b 
2  0 2009-10-01 00:00:00 c 
3  1 2009-09-30 12:00:00 d 
4  1 2009-09-30 18:00:00 e 
5  2 2009-09-30 12:00:00 f 
6  3 2009-09-30 12:00:00 g 
... 

In [35]: df1_filtered_out 
Out[35]: 
    member   time   value 
0  0 2009-09-30 12:00:00 a 
1  0 2009-09-30 18:00:00 b 
3  1 2009-09-30 12:00:00 d 
4  2 2009-09-30 12:00:00 g 
... 

並且也得到過濾的df2。

回答

4

請在membertime列的內連接:

>>> df1.merge(df2, on=['member', 'time'], how='inner') 
    member    time 
0  0 2009-09-30 12:00:00 
1  0 2009-09-30 18:00:00 
2  1 2009-09-30 12:00:00 
3  2 2009-09-30 12:00:00 

這將產生一個只有那些在兩個DataFrames相同membertime值的行的結果。

更新:

>>> df1.merge(df2[['member', 'time']]) 
    member    time value 
0  0 2009-09-30 12:00:00  a 
1  0 2009-09-30 18:00:00  b 
2  1 2009-09-30 12:00:00  d 
3  2 2009-09-30 12:00:00  f 
+1

梅傑斯都默認 '內',使'how'參數是沒有必要的。 – EdChum

+0

@EdChum我知道,但我明確指定'how'參數來顯示OP,如果他決定做不同的事情,他如何將這種行爲改變爲'right','left'或'outer'。但是,是的,這是一個有用的評論。 +1。 –

+0

感謝您的回答和評論。你的答案與我想要做的幾乎相同,但我希望得到'過濾'DataFrame,而不是'合併'。你能告訴我過濾出重複原料的方法嗎? (更新我的問題) – Tetsuro