Pandas 数据帧过滤多种条件

tet*_*May 11 python filter pandas

我有以下数据框

df = pd.DataFrame([[1990,7,1000],[1990,8,2500],[1990,9,2500],[1990,9,1500],[1991,1,250],[1991,2,350],[1991,3,350],[1991,7,450]], columns = ['year','month','data1'])

year    month    data1
1990      7      1000
1990      8      2500
1990      9      2500
1990      9      1500
1991      1      250
1991      2      350
1991      3      350
1991      7      450
Run Code Online (Sandbox Code Playgroud)

我想过滤数据,使其不包含月/年 07/1990、08/1990 和 01/1991 的数据。我可以为每个组合月/年做如下:

df = df.loc[(df.year != 1990) | (df.month != 7)]
Run Code Online (Sandbox Code Playgroud)

但是如果月/年有很多组合,则效率不高。有没有更有效的方法来做到这一点?

非常感谢。

Dan*_*ejo 11

你可以这样做:

mask = ~df[['year', 'month']].apply(tuple, 1).isin([(1990, 7), (1990, 8), (1991, 1)])
print(df[mask])
Run Code Online (Sandbox Code Playgroud)

输出

   year  month  data1
2  1990      9   2500
3  1990      9   1500
5  1991      2    350
6  1991      3    350
7  1991      7    450
Run Code Online (Sandbox Code Playgroud)


Pie*_*e D 10

甚至更快(大约是@DaniMesejo 应用的优雅版本的 3 倍tuple)。但它也依赖于月份限制在(远低于)100 的知识,因此不太通用:

mask = ~(df.year*100 + df.month).isin({199007, 199008, 199101})
df[mask]

# out:
   year  month  data1
2  1990      9   2500
3  1990      9   1500
5  1991      2    350
6  1991      3    350
7  1991      7    450
Run Code Online (Sandbox Code Playgroud)

为什么这比元组解决方案快 3 倍?(速度技巧):

  1. 所有矢量化操作,没有apply.
  2. 没有字符串操作,都是整数。
  3. 使用.isin()一组作为参数(不是列表)。