繁体   English   中英

Python DataFrame中的多级过滤器

[英]Multi-level filters in Python DataFrame

考虑以下熊猫数据框:

import pandas as pd

products = [{'SKU': 'XYZ1', 'Category': 'A', 'Sub_Category': 'A1', 'Color': 'Red'},
            {'SKU': 'XYZ2', 'Category': 'A', 'Sub_Category': 'A2', 'Color': 'Red'},
            {'SKU': 'XYZ3', 'Category': 'A', 'Sub_Category': 'A2', 'Color': 'BLACK'},
            {'SKU': 'ABC1', 'Category': 'B', 'Sub_Category': 'B1', 'Color': 'Red'},
            {'SKU': 'ABC2', 'Category': 'B', 'Sub_Category': 'B1', 'Color': 'BLACK'},
            {'SKU': 'ABC3', 'Category': 'B', 'Sub_Category': 'B2', 'Color': 'BLACK'}]

df = pd.DataFrame(products)

产品中的每个SKU都是唯一的,并且映射到层次结构(例如类别/子类别)以及属性(例如颜色)

我想了解如何能够基于产品主数据上的过滤器来过滤SKU。 如果没有为层次结构/属性的任何级别提供选项,请考虑所有选项。

例如

类别= ['A','B'](A或B)的所有产品

Sub_Category = ['B1']和Color = ['Red','Black'](B1为红色或黑色)的所有产品

谢谢!

您可以query数据框:

L1 = ['A', 'B']
L2 = ['Red', 'BLACK']

res1 = df.query('Category in @L1')
res2 = df.query('Sub_Category == "B1" and Color in @L2')

对于您的第一个过滤器。 选择您必须使用的Tegory A或B:

df[(df['Category'] == 'A') | (df['Category'] == 'B')]

对于第二个:

df[(df['Sub_Category'] == 'B1') & ((df['Color'] == 'Red') | (df['Color'] == 'BLACK'))]
>>> df
  Category  Color   SKU Sub_Category
0        A    Red  XYZ1           A1
1        A    Red  XYZ2           A2
2        A  BLACK  XYZ3           A2
3        B    Red  ABC1           B1
4        B  BLACK  ABC2           B1
5        B  BLACK  ABC3           B2

>>> df[(df['Sub_Category'] == 'B1') & (df.Color.isin(['Red','BLACK']))]
  Category  Color   SKU Sub_Category
3        B    Red  ABC1           B1
4        B  BLACK  ABC2           B1

和过滤CategoryAB

>>> df[df.Category.isin(['A','B'])]
  Category  Color   SKU Sub_Category
0        A    Red  XYZ1           A1
1        A    Red  XYZ2           A2
2        A  BLACK  XYZ3           A2
3        B    Red  ABC1           B1
4        B  BLACK  ABC2           B1
5        B  BLACK  ABC3           B2

当我开始使用Pandas时,我发现构建和链接小块非常有用且易读:

例如

#1. Select Category A or B: Pandas uses | for or and & for and.

categoryA = df['Category'] == 'A'
categoryB = df['Category'] == 'B'
catAorB = categoryA | categoryB

df[catAorB]


#2. All products where Sub_Category = ['B1'] and Color = ['Red', 'Black'] (a B1 that is either Red or Black).



subCatB1 = df['Sub_Category'] == 'B1'
colorRed = df['Color'] == 'Red'
colorBlack = df['Color'] == 'BLACK'

colRedorBlack = colorRed | colorBlack
subCatB1andRB = subCatB1 & colRedorBlack

df[subCatB1andRB]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM