如何在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
相关产品推荐
相关产品推荐

