You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:不使用set_index方法,多条件查找指定DataFrame行

Pandas筛选指定日期和分类的行(不使用set_index)

我来帮你解决这个问题!你手头有这样的Pandas DataFrame:

import pandas as pd

data = {'category':[1, 2, 3, 1, 2, 3, 1, 2, 3], 
        'date':['2000-01-01', '2000-01-01', '2000-01-01', '2000-01-02', '2000-01-02', '2000-01-02', '2000-01-03', '2000-01-03', '2000-01-03']}
df = pd.DataFrame(data=data)
df['date'] = pd.to_datetime(df['date'])

生成的DataFrame如下:

categorydate
12000-01-01
22000-01-01
32000-01-01
12000-01-02
22000-01-02
32000-01-02
12000-01-03
22000-01-03
32000-01-03

你需要找到date为2000-01-02且category为3的行(也就是索引为5的那一行),而且因为实际数据中date列存在重复值,设置索引会报错InvalidIndexError: Reindexing only valid with uniquely valued Index objects,所以不能用set_index('date')的方法。

方法1:布尔索引筛选

这是最直接的方式,用&连接两个筛选条件,注意要给每个条件加上括号(避免运算符优先级问题):

# 筛选符合条件的行
result = df[(df['date'] == pd.to_datetime('2000-01-02')) & (df['category'] == 3)]
print(result)

运行后会得到:

category       date
5         3 2000-01-02

因为你的date列已经转成了datetime类型,这里把筛选的日期也转成datetime是最稳妥的做法,当然直接用字符串'2000-01-02'也能匹配到,不过统一类型可以避免潜在的格式问题。

方法2:使用query方法

如果你觉得布尔索引的写法有点繁琐,可以用query()方法,语法更简洁直观:

result = df.query("date == '2000-01-02' and category == 3")
print(result)

这个方法不需要考虑运算符优先级,代码可读性更高,同样能得到你想要的那一行。

这两种方法都不需要修改DataFrame的索引,完美适配你实际数据中date列不唯一的情况,不会出现索引相关的错误。

内容的提问来源于stack exchange,提问作者Chiel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:22:39