Столбец со списком строк в python

У меня есть pandas dataframe, как показано ниже:

                                          categories  review_count
0                  [Burgers, Fast Food, Restaurants]           137
1                         [Steakhouses, Restaurants]           176
2  [Food, Coffee & Tea, American (New), Restaurants]           390
...                                          ....              ...
...                                          ....              ...
...                                          ....              ...

Из этого dataFrame я хотел бы извлечь только те строки, в которых список в столбце "категории" этой строки содержит категорию "Рестораны". Я до сих пор пробовал: df[[df.categories.isin('Restaurants'),review_count]],

поскольку у меня также есть другие столбцы в dataFrame, я указал эти два столбца, которые я хочу извлечь. Но я получаю сообщение об ошибке:

TypeError: unhashable type: 'list'

Я не очень понимаю, что означает эта ошибка, поскольку я очень новичок в pandas. Пожалуйста, дайте мне знать, как я могу достичь своей цели извлечения только тех строк из dataFrame, где столбец "категории" для этой строки имеет строку "Рестораны" как часть категории_list. Любая помощь будет высоко оценена.

Спасибо заранее!

Ответ 1

Я думаю, вам, возможно, придется использовать функцию lambda для этого, так как вы можете проверить, является ли значение в вашем столбце isin некоторой последовательностью, но pandas, похоже, не предоставляет функцию для проверки того, последовательность в вашем столбце содержит некоторое значение:

import pandas as pd
categories = [['fast_food', 'restaurant'], ['coffee', 'cafe'], ['burger', 'restaurant']]
counts = [137, 176, 390]
df = pd.DataFrame({'categories': categories, 'review_count': counts})
# Show which rows contain 'restaurant'
df.categories.map(lambda x: 'restaurant' in x)
# Subset the dataframe using this:
df[df.categories.map(lambda x: 'restaurant' in x)]

Вывод:

Out[11]: 
                categories  review_count
0  [fast_food, restaurant]           137
2     [burger, restaurant]           390

Ответ 2

Хорошо, поэтому я уже давно пытаюсь найти ответ на этот вопрос, но придумал пустой (без написания небольшой рекурсивной программы для расширения списка), и я думаю, что, поскольку сначала румяна в любом случае, то, что вы пытаетесь сделать, на самом деле не так эффективно (комментарий Jimmy C о том, что списки, являющиеся изменяемыми, находятся здесь), и это не так, как вы делали это чаще всего в Pandas.

Лучше и (я думаю) быстрее будет хранить ваш вложенный список в виде значений столбцов, чтобы у вас было:

df
    review_count    Burgers   Fast Food   Restaurants    Steakhouses  Food    CoffeeTea  American (New)
0            137    True      True        True           False        False   False      False
1            176    False     False       True           True         False   False      False
2            390    False     False       True           False        True    True       True   

Очевидно, это связано с написанием программы python, чтобы вытащить ваши категории из своих вложенных списков, а затем экспортировать их в DataFrame, но это однократное попадание (для существующих данных) может оказаться полезным для того, что вы получаете при использовании pandas для анализа результирующего фрейма.

В разделе Wes вы можете найти Python для анализа данных под названием "Computing Indicator/Dummy Variables" (примерно около 330), который был бы хорошим ресурсом для такого рода операций.

Извините, это на самом деле не отвечает на ваш вопрос, и я, конечно, не знаю, насколько это возможно, но в остальном вы можете попробовать решение rtrwalker, которое выглядит довольно хорошо, но это ветка развития, просто FYI.

Ответ 3

Я думаю, что в pandas0.12 вы можете делать такие вещи, как:

df.query('"Restaurants" in categories')

docs на pandas.DataFrame.query