pandas:按多种条件过滤组?

时间:2017-05-05 08:58:00

标签: python pandas filter multiple-conditions

我有一个如下所示的数据框:

|floatformat

我希望获得2016年初df = pd.DataFrame([ {'id': 123, 'date': '2016-01-01', 'is_local': True }, {'id': 123, 'date': '2017-01-01', 'is_local': False }, {'id': 124, 'date': '2016-01-01', 'is_local': True }, {'id': 124, 'date': '2017-01-01', 'is_local': True } ]) df.date = df.date.astype('datetime64[ns]') 为True的所有ID列表,但2017年初为False。我已经开始按ID进行分组:

is_local

然后我试过这只是为了过滤这些条件中的第二个(作为一种入门方式),但它会返回所有组:

gp = df.groupby('id')

如何以我需要的方式过滤?

3 个答案:

答案 0 :(得分:8)

d1 = df.set_index(['id', 'date']).is_local.unstack()
d1.index[d1['2016-01-01'] & ~d1['2017-01-01']].tolist()

[123]

答案 1 :(得分:3)

另一种方法是通过pivoting

In [24]: ids_by_dates = df.pivot(index='id', columns='date',values='is_local')

In [25]: ids_by_dates['2016-01-01'] & ~ids_by_dates['2017-01-01']
Out[25]: 
id
123     True
124    False

答案 2 :(得分:3)

您可以尝试使用datetime库中的datetime模块,并为数据框传递多个条件

from datetime import datetime
df = pd.DataFrame([
  {'id': 123, 'date': '2016-01-01', 'is_local': True },
  {'id': 123, 'date': '2017-01-01', 'is_local': False },
  {'id': 124, 'date': '2016-01-01', 'is_local': True },
  {'id': 124, 'date': '2017-01-01', 'is_local': True }
])
df.date = df.date.astype('datetime64[ns]')

使用多个条件来分割所需的数据框

a = df[(df.is_local==True) & (df.date<datetime(2016,12,31) & (df.date>datetime(2015,12,31))]
b = df[(df.is_local==False) & (df.date<datetime(2017,12,31)) & (df.date>datetime(2016,12,31))]

稍后使用pandas连接

final_df = pd.concat((a,b))

将输出第1行和第2行

    date        id  is_local
2   2016-01-01  124 True
1   2017-01-01  123 False

单行如下

final_df = pd.concat((df[(df.is_local==True) & (df.date<datetime(2016,12,31) & (df.date>datetime(2015,12,31))], df[(df.is_local==False) & (df.date<datetime(2017,12,31)) & (df.date>datetime(2016,12,31))]))