2016-09-28 105 views
1

我在熊貓中非常新,希望有人至少能指出我正確的方向。從不同列中的值中篩選數據框熊貓

這裏是實際的問題:

DF:

  time    Area  lon  lat  mode   ID 
    1993-08-01 00:34:28   A 45.627800 34.733400  false  3183 
    1993-08-01 00:34:28   A 45.699600 34.639300  false  3183 
    1993-08-01 00:34:28   A 45.603800 34.730600  false  3183 
    1992-03-21 01:13:18   A 45.686400 34.548100  false  3184 
    1992-03-21 01:13:18   A 45.702400 34.554300  false  3184 
    1992-03-21 01:13:18   B 45.304784 34.626540  NaN  3184 
    1992-03-21 16:13:20   A 45.633800 34.709700  false  3185 
    1992-03-21 16:13:20   A 45.643400 34.709000  true  3185 
    1992-03-21 16:13:20   A 45.634600 34.959500  true  3185 

我想篩選出的'ID',僅僅具有一個'區域'數據的所有實例(無論是A或B)。因此,「ID」的I想必須具有至少一個實例「A」AND「B」要被存儲在新的數據幀。眼下

1992-03-21 01:13:18   A 45.686400 34.548100  false  3184 
    1992-03-21 01:13:18   A 45.702400 34.554300  false  3184 
    1992-03-21 01:13:18   B 45.304784 34.626540  NaN  3184 

我要嘗試做一個普通的for循環與if語句和一個列表臨時儲存「地區:

從DF上面只介紹如下的entires提出適合約束'屬性爲每個'ID'。這感覺像一個非常糟糕的方法,必須有一些慣用的熊貓方法來做到這一點。

+0

爲什麼輸出中缺少'1992-03-21 01:13:18 A 45.686400 34.548100 false 3184'? – jezrael

+0

我不明白你的意思?最後兩行是所需要的,因爲它們是共享唯一「ID」並且包括區域A和B的唯一條目 – PigFoot

+0

嗯,但區域「A」具有2行,具有「ID = 3184」和「B」只有一個。那麼爲什麼在輸出中只有'A'類的一行,而不是在我的答案下面呢? – jezrael

回答

0

我認爲你需要pivot_tabledropna去除這並非在所有組中的所有值:與isin

​​

最後使用boolean indexing

print (df[df.ID.isin(vals)]) 
        time Area  lon  lat mode ID 
3 1992-03-21 01:13:18 A 45.686400 34.54810 False 3184 
4 1992-03-21 01:13:18 A 45.702400 34.55430 False 3184 
5 1992-03-21 01:13:18 B 45.304784 34.62654 NaN 3184 
+0

非常感謝!它具有超過200萬行的完整數據集,可以完美快速地工作。 – PigFoot

0

你可以看看下面的:

In [24]: df 
Out[24]: 
    area id 
0 A 3183 
1 A 3183 
2 A 3184 
3 B 3184 
4 A 3185 
5 A 3185 

In [25]: df[df.groupby('id')['area'].transform('nunique') > 1] 
Out[25]: 
    area id 
2 A 3184 
3 B 3184 

我將我的示例簡化爲僅有的兩個相關列(ID和區域),但這對於完整的DataFrame沒有任何問題。

我基本上統計每個ID的不同區域的數量,並過濾掉只有一個區域的區域。

+0

我試過你的方法,但它不適合我。也許我做錯了什麼。無論如何,謝謝你的幫助! – PigFoot