Python DataFrame中的多级过滤器

时间:2018-10-05 13:37:26

标签: python pandas

考虑以下熊猫数据框:

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)的所有产品

谢谢!

4 个答案:

答案 0 :(得分:3)

您可以query您的数据框:

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

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

答案 1 :(得分:1)

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

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

第二个:

df[(df['Sub_Category'] == 'B1') & ((df['Color'] == 'Red') | (df['Color'] == 'BLACK'))]

答案 2 :(得分:1)

>>> 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

并过滤A中的BCategory

>>> 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

答案 3 :(得分:0)

当我开始使用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]