熊猫:按多个条件过滤组?

Posted

技术标签:

【中文标题】熊猫:按多个条件过滤组?【英文标题】:pandas: filter group by multiple conditions? 【发布时间】:2017-10-03 16:21:27 【问题描述】:

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

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]')

我想获取所有 ID 的列表,其中 is_local 在 2016 年初为 True,但在 2017 年初为 False。我首先按 ID 分组:

gp = df.groupby('id')

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

gp.apply(lambda x: ~x.is_local & (x.date > '2016-12-31'))

如何按照我需要的方式进行过滤?

【问题讨论】:

【参考方案1】:
d1 = df.set_index(['id', 'date']).is_local.unstack()
d1.index[d1['2016-01-01'] & ~d1['2017-01-01']].tolist()

[123]

【讨论】:

【参考方案2】:

另一种方法是通过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

【讨论】:

【参考方案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))]))

【讨论】:

谢谢 - 我将如何使用它来获取 has_local 在 2016 年初为 True 而在 2017 年为 False 的所有行? 我只能想到一个肮脏的解决方案,您可以添加多个条件并将它们连接在一起..相应地编辑了我的答案.. 我还用另一个条件编辑了我的答案,将年份分别限制在 2016 年和 2017 年

以上是关于熊猫:按多个条件过滤组?的主要内容,如果未能解决你的问题,请参考以下文章

在 dplyr 中按组过滤多个条件的条件 IF

在Javascript中按多个条件过滤数组

如何在 Flask SQLAlchemy 中按多个条件进行过滤?

Ionic 4 按多个值过滤 JSON

熊猫:考虑多种条件正确过滤数据框列

r - 按日期过滤,按条件分组