基于多列值的Pandas DataFrame筛选:保留关联多供应商的商品行
问题描述
我们有一个无空值的pandas DataFrame,包含Vendor、Item、Facility三列,满足以下规则:
- 每个
Item对应的Facility值唯一 - 一个
Item可关联一个或多个Vendor - 同一
Vendor可在同一Item的不同Facility中多次出现 - 同一
Item的一个Facility仅关联一个Vendor Item值有序- 每一行唯一
示例数据如下:
| Vendor | Item | Facility |
|---|---|---|
| V1 | I1 | F1 |
| V1 | I1 | F2 |
| V2 | I1 | F4 |
| V1 | I2 | F1 |
| V1 | I2 | F2 |
| V2 | I2 | F3 |
| V3 | I2 | F5 |
| V3 | I2 | F6 |
| V3 | I3 | F3 |
| V1 | I4 | F2 |
| V4 | I4 | F4 |
| V4 | I4 | F5 |
| V1 | I5 | F1 |
| V1 | I5 | F4 |
需求:创建新DataFrame,仅保留关联了多个唯一Vendor的Item的所有行,排除仅关联单个Vendor的Item行。比如示例中要保留I1、I2、I4的所有行,去掉I3、I5的行。
我尝试过循环为每个Item生成唯一Vendor列表,再判断len(Appended_Vendor_List_var) > 1,但没成功。
解决方案
不用循环,用pandas的分组统计就能高效解决,步骤如下:
统计每个Item的唯一Vendor数量
按Item分组后,对Vendor列统计唯一值的数量:vendor_counts = df.groupby('Item')['Vendor'].nunique()筛选符合条件的Item
提取出唯一Vendor数量大于1的Item:valid_items = vendor_counts[vendor_counts > 1].index过滤原DataFrame
保留原DataFrame中Item在valid_items里的所有行:filtered_df = df[df['Item'].isin(valid_items)]
也可以把三步合并成一行,更简洁:
filtered_df = df[df.groupby('Item')['Vendor'].transform('nunique') > 1]
这里transform会把每个分组的计算结果对应到原DataFrame的每一行,直接完成筛选。
内容的提问来源于stack exchange,提问作者John Fonte
相关产品推荐
相关产品推荐

