Я новичок в pandas, и у меня возникли проблемы с выбором любой строки, в которой столбец «Категория» содержит строку «Изолированный».
Я пробовал .str.contains('Insulated')
и binned[binned['Category'].isin(['Insulated Down', 'Insulated Synthetic'])]
. Это возвращается с NaN
или не выделяет ни одной строки.
Я не уверен, хочу ли я сделать неправильно.
Любая помощь очень ценится, спасибо.
Ниже код группирует расположение бункера:
binned = bin[~bin['Bin Location'].isin(['WH 2', '*WH3*'])].groupby('Bin Location').agg({'Quantity On Hand' : 'sum', 'Category' : 'unique'}).reset_index().sort_values(by='Quantity On Hand', ascending=False)
Я ожидал, что при этом будут выбраны все места бункеров, в которых категория содержит «Утепленный пух» и «Утепленный синтетический материал».
Чтобы расширить превосходный подход @Scott Boston для решения вашей проблемы с двумя строками («Изолированная нижняя» и «Изолированная синтетическая»), вы можете использовать код типа: df2 = df[df.explode('col1')['col1'].str.contains('A|F').groupby(level=0).any()]]
, который использует оператор ИЛИ.
Значения в столбце 'Category'
представляют собой списки, поэтому возможное решение — использовать apply
на axis=1
и проверять каждый элемент в каждом списке:
import pandas as pd
df = pd.DataFrame(
{"Quantity": [1, 2], "Category": [["Bikepacking", "Hats"], ["Insulated Down"]]}
)
m = df.apply(lambda x: any("Insulated" in e for e in x["Category"]), axis=1)
out = df[m]
Quantity Category
1 2 [Insulated Down]
Я думаю, что ваш фрейм данных содержит список в столбцах, поэтому вам нужно сначала разобрать список, чтобы проверить каждый элемент в списке с помощью .str. Пример...
df = pd.DataFrame({'col1':[['A', 'B', 'C'],['E', 'F', 'G']]})
входной фрейм данных. Тогда попробуйте это...df[df.explode('col1')['col1'].str.contains('A').groupby(level=0).any()]