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如下:
| category | date |
|---|---|
| 1 | 2000-01-01 |
| 2 | 2000-01-01 |
| 3 | 2000-01-01 |
| 1 | 2000-01-02 |
| 2 | 2000-01-02 |
| 3 | 2000-01-02 |
| 1 | 2000-01-03 |
| 2 | 2000-01-03 |
| 3 | 2000-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
相关产品推荐
相关产品推荐

