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

如何在Python pandas中按CategoryID批量标记符合条件的类别书籍为Evaluated

用Pandas实现类别级别的书籍标记需求

嘿,这个需求其实很好实现,用pandas的分组和条件判断就能搞定,我给你一步步拆解:

1. 先把所有逻辑条件写清楚

首先得把你提到的各个逻辑定义好,你没写完的logic3我先补个示例,到时候你替换成自己实际的条件就行;还有logic4我也加了个示例,记得换成你的真实逻辑哦:

import pandas as pd

# 假设你的数据集是这个books DataFrame
# 定义各个逻辑条件
logic1 = books['CategoryPopulair'] == True
logic2 = (books['BookTitle'] == 'Hello1') & (books['BookRead'] == True) & (books['BookNice'] == True)
# 示例logic3,替换成你的实际条件
logic3 = (books['BookTitle'] == 'Hello2') & (books['BookRead'] == False) & (books['BookNice'] == True)
# 示例logic4,替换成你的实际条件
logic4 = books['BookPrice'] > 20

2. 计算每本书是否符合复合条件

接下来把这些逻辑组合起来,得到每本书是否满足logic1 & (logic2 | logic3) & logic4这个总条件:

# 单本书的满足情况,返回的是布尔值的Series
book_qualifies = logic1 & (logic2 | logic3) & logic4

3. 找出有合格书籍的类别

现在我们要找出哪些CategoryID下至少有一本书符合上面的条件,这里有两种方式:

  • 简单版:直接筛选出符合条件的行,取唯一的CategoryID
qualified_cats = books[book_qualifies]['CategoryID'].unique()
  • 高效版(适合大数据量):用groupby分组,判断每个组里是否有符合条件的书
# 分组后检查每个类别是否存在合格书籍
cat_has_qualified = books.groupby('CategoryID').apply(lambda x: book_qualifies[x.index].any())
# 提取出符合条件的CategoryID列表
qualified_cats = cat_has_qualified[cat_has_qualified].index.tolist()

大数据量的话优先用第二种,性能会好很多。

4. 给目标类别所有书籍打标记

最后一步就是给这些合格类别下的所有书籍标记'Evaluated',其他的可以设为默认值比如'Not Evaluated':

# 先初始化标记列
books['EvaluationStatus'] = 'Not Evaluated'
# 把符合条件的类别下的书籍改成'Evaluated'
books.loc[books['CategoryID'].isin(qualified_cats), 'EvaluationStatus'] = 'Evaluated'

完整可运行示例

我给你写了个完整的示例,你可以直接跑起来看看效果,记得替换成自己的真实数据哦:

import pandas as pd

# 模拟你的书籍数据
sample_data = {
    'CategoryID': [1,1,2,2,3,3],
    'CategoryPopulair': [True, True, False, True, True, True],
    'BookTitle': ['Hello1', 'Hello2', 'Hello3', 'Hello1', 'Hello1', 'Hello2'],
    'BookRead': [True, False, True, True, False, False],
    'BookNice': [True, True, False, True, True, True],
    'BookPrice': [25, 30, 15, 22, 18, 28]
}
books = pd.DataFrame(sample_data)

# 定义逻辑条件
logic1 = books['CategoryPopulair'] == True
logic2 = (books['BookTitle'] == 'Hello1') & (books['BookRead'] == True) & (books['BookNice'] == True)
logic3 = (books['BookTitle'] == 'Hello2') & (books['BookRead'] == False) & (books['BookNice'] == True)
logic4 = books['BookPrice'] > 20

# 计算单本书是否合格
book_qualifies = logic1 & (logic2 | logic3) & logic4

# 找出合格类别
cat_has_qualified = books.groupby('CategoryID').apply(lambda x: book_qualifies[x.index].any())
qualified_cats = cat_has_qualified[cat_has_qualified].index.tolist()

# 添加标记
books['EvaluationStatus'] = 'Not Evaluated'
books.loc[books['CategoryID'].isin(qualified_cats), 'EvaluationStatus'] = 'Evaluated'

# 打印结果看看
print(books)

运行后你会发现CategoryID为1的所有书都被标记成了'Evaluated',因为这个类别里有两本书符合条件;而CategoryID为3里只有一本符合,但整个类别也会被标记,CategoryID为2则不符合条件,保持默认状态。

小提醒

  • 要是你的logic3或logic4有更复杂的逻辑,直接替换对应的表达式就行,核心的分组和标记逻辑不用改。
  • 要是你不需要默认值,也可以把标记列初始化为空,再给合格类别赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:49:43