从不同列Pandas中的值过滤数据帧

时间:2016-09-28 07:47:14

标签: python pandas

我是熊猫新手,希望有人至少可以指出我正确的方向。

实际问题出现了:

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'的所有实例,这些实例只有来自一个'Area'的数据 A或B ) 。因此,我想要的'ID'必须至少有一个'A' AND 'B'的实例存储在新的数据框中。

从上面提到的df中,只有下面提到的eninres符合约束条件:

    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

现在我要尝试使用if语句和一个列表临时存储每个'ID''Area'属性。这感觉就像一个非常糟糕的方法,必须有一些惯用的熊猫这样做。

2 个答案:

答案 0 :(得分:0)

我认为您需要使用pivot_table dropna来删除所有不属于所有组的值:

print (df.pivot_table(index='Area', columns='ID', values='lat').dropna(axis=1))
ID        3184
Area          
A     34.55120
B     34.62654

vals = df.pivot_table(index='Area', columns='ID', values='lat').dropna(axis=1).columns
print (vals)
Int64Index([3184], dtype='int64', name='ID')

上次使用boolean indexingisin

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

答案 1 :(得分: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和区域),但这对您的完整数据框没有问题。

我基本上计算每个ID的不同区域的数量,并过滤掉只有一个区域的区域。