2016-09-28 115 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