Многоуровневые фильтры в Python DataFrame - PullRequest
0 голосов
/ 05 октября 2018

Рассмотрим следующий кадр данных 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 в продукте уникален и сопоставляется с иерархиями (например, Категория / Подкатегория), а также с атрибутами, например, Цвет

Iхотите понять, как можно фильтровать SKU на основе фильтров основных данных продукта.Если для какого-либо уровня иерархии / атрибута не предоставлено никаких опций, рассмотрите все допустимые опции.

например,

Все продукты, где категория = ['A', 'B'] (либо Aили B)

Все продукты, в которых Sub_Category = ['B1'] и Color = ['Red', 'Black'] (красный или черный B1)

спасибо!

Ответы [ 4 ]

0 голосов
/ 05 октября 2018

Когда я начал использовать 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]
0 голосов
/ 05 октября 2018
>>> 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 & B in Category:

>>> 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
0 голосов
/ 05 октября 2018

Вы можете query ваш фрейм данных:

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

res1 = df.query('Category in @L1')
res2 = df.query('Sub_Category == "B1" and Color in @L2')
0 голосов
/ 05 октября 2018

Для вашего первого фильтра.Выберите теги A или B, которые вы должны использовать:

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

Для второго:

df[(df['Sub_Category'] == 'B1') & ((df['Color'] == 'Red') | (df['Color'] == 'BLACK'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...