Pandas筛选指定Category Type的Receipt ID及交集ID
问题解决:筛选包含指定类别的Receipt ID
先修正你获取Food类去重Receipt ID的方法
你的两种方法都存在问题:
- 方法一错误原因:
query语句里的字符串值需要加单引号,否则Python会把Food当成变量而非字符串常量,修正后代码:
df1 = df.query("Category Type == 'Food'")['Receipt ID'].unique()
或者用更直观的布尔索引写法:
df1 = df[df['Category Type'] == 'Food']['Receipt ID'].unique()
- 方法二错误原因:逻辑完全偏差,把
Category Type设为索引后,用eq('Food')去对比Receipt ID列(都是数字),结果全是False,自然返回空列表,这个思路没必要采用。
最终目标:找到同时包含Food和Drink的Receipt ID
这里提供两种高效的实现方式:
方法一:分组后检查类别集合
通过分组收集每个Receipt ID对应的所有类别,再筛选同时包含两个目标类别的ID:
import pandas as pd # 读取CSV文件(假设你已完成这一步) df = pd.read_csv('your_file.csv') # 按Receipt ID分组,将每个组的Category Type转为集合 category_groups = df.groupby('Receipt ID')['Category Type'].apply(set) # 筛选出同时包含Food和Drink的Receipt ID target_ids = category_groups[category_groups >= {'Food', 'Drink'}].index.tolist() print(target_ids) # 输出: [135135, 169071]
方法二:交叉表统计筛选
用交叉表统计每个Receipt ID下各类别的出现次数,再筛选两类都有记录的ID:
import pandas as pd df = pd.read_csv('your_file.csv') # 生成交叉表,行是Receipt ID,列是Category Type,值为出现次数 count_table = pd.crosstab(df['Receipt ID'], df['Category Type']) # 筛选Food和Drink计数都大于0的ID target_ids = count_table[(count_table['Food'] > 0) & (count_table['Drink'] > 0)].index.tolist() print(target_ids) # 输出: [135135, 169071]
内容的提问来源于stack exchange,提问作者qyy
相关产品推荐
相关产品推荐

