2016-03-13 6 views
2
структура

данных:фильтра строк DataFrame что списки

  • панды DataFrame (business_df) с колонкой (category) списков, что я заинтересован в

  • список, содержащий категории ресторана (restaurant_categories_list)

То, что я пытаюсь сделать:

Отфильтруйте предприятия в business_df на основании их столбца category (который имеет структуру списка), классифицируя бизнес как ресторан, если хотя бы одна из перечисленных категорий соответствует хотя бы одной из категорий ресторанов.

Я проверил эти 2 вопроса, но они не дают ответа на мою проблему:

Filter dataframe rows if value in column is in a set list of values

use a list of values to select rows from a pandas dataframe

Я выполняющей этот код прямо сейчас:

restaurant_categories_list = ['Soup','Sandwiches','Salad', 'Restaurants','Burgers', 'Breakfast & Brunch'] 
print(business_df.loc[business_df['categories'].isin(restaurant_categories_list)]) 

И здесь интересующая меня колонна:

0       ['Fast Food', 'Restaurants'] 
1           ['Nightlife'] 
2       ['Auto Repair', 'Automotive'] 
3     ['Active Life', 'Mini Golf', 'Golf'] 
4  ['Shopping', 'Home Services', 'Internet Servic... 
5  ['Bars', 'American (New)', 'Nightlife', 'Loung... 
6  ['Active Life', 'Trainers', 'Fitness & Instruc... 
7  ['Bars', 'American (Traditional)', 'Nightlife'... 
8    ['Auto Repair', 'Automotive', 'Tires'] 
9       ['Active Life', 'Mini Golf'] 
10      ['Home Services', 'Contractors'] 
11       ['Veterinarians', 'Pets'] 
12  ['Libraries', 'Public Services & Government'] 
13    ['Automotive', 'Auto Parts & Supplies'] 
14 ['Burgers', 'Breakfast & Brunch', 'American (T... 

Так что, если я только работать с этими строками, мой ожидается dataframe должен содержать только строки 0 и 14.

+1

Можете ли вы дать образец данных? –

+0

добавление к комментарию @ ChuckLoganLim: и ожидаемый результат, пожалуйста ... – MaxU

+0

размещение таких вещей, как списки в dataframes, похоже, не дает хорошей производительности в любом случае (на самом деле это не предполагаемый прецедент) - вы можете использовать 'to_dict' для получения словаря python и перебирать их, или разбивать списки на столбцы с истинным/ложным значением, что кажется более дружелюбным к панде (не экспертом, но на прошлой неделе делали подобные вещи ...) –

ответ

1

UPDATE:

Эта версия использует ast.literal_eval(), чтобы десериализации список из строк и это, кажется, работает правильно:

import ast 
import pandas as pd 

restaurant_categories_list=['Soup','Sandwiches','Salad', 'Restaurants','Burgers', 'Breakfast & Brunch'] 

df_orig = pd.read_csv('yelp_academic_dataset_business.csv', low_memory=False) 

df = df_orig[(pd.notnull(df_orig['categories']))] 

mask = df['categories'].apply(ast.literal_eval).apply(pd.Series).isin(restaurant_categories_list).sum(axis=1) > 0 

print(df.ix[mask, ['categories']]) 
df[mask].to_csv('result.csv', index=False) 

Но @CorleyBrigman уже сказала, что это очень сложно и очень неэффективно работать с такой структурой данных с использованием Па NDAS ...

OLD ОТВЕТ НА ОСНОВЕ SAMPLE DATA:

вы можете конвертировать списки столбцов/Series затем использовать pd.isin() функцию, которая будет производить матрицы True/False значений, которые могут быть суммированы (потому что в Python: Ложные == 0 и правда == 1):

mask = df['business'].apply(pd.Series).isin(restaurant_categories_list).sum(axis=1) > 0 
print(df[(mask)]) 

Объяснение:

print(df['business'].apply(pd.Series)) 

       0        1     2  3 
0  Fast Food     Restaurants    NaN NaN 
1  Nightlife       NaN    NaN NaN 
2  Auto Repair     Automotive    NaN NaN 
3  Active Life      Mini Golf    Golf NaN 
4  Shopping     Home Services Internet Servic NaN 
5   Bars    American (New)   Nightlife Loung 
6  Active Life      Trainers Fitness & Instruc NaN 
7   Bars  American (Traditional)   Nightlife NaN 
8  Auto Repair     Automotive    Tires NaN 
9  Active Life      Mini Golf    NaN NaN 
10 Home Services     Contractors    NaN NaN 
11 Veterinarians       Pets    NaN NaN 
12  Libraries Public Services & Government    NaN NaN 
13  Automotive   Auto Parts & Supplies    NaN NaN 
14  Burgers   Breakfast & Brunch   American NaN 

затем

print(df['business'].apply(pd.Series).isin(restaurant_categories_list)) 

выход:

 0  1  2  3 
0 False True False False 
1 False False False False 
2 False False False False 
3 False False False False 
4 False False False False 
5 False False False False 
6 False False False False 
7 False False False False 
8 False False False False 
9 False False False False 
10 False False False False 
11 False False False False 
12 False False False False 
13 False False False False 
14 True True False False 

затем

mask = df['business'].apply(pd.Series).isin(restaurant_categories_list).sum(axis=1) > 0 
print(mask) 

выход:

0  True 
1  False 
2  False 
3  False 
4  False 
5  False 
6  False 
7  False 
8  False 
9  False 
10 False 
11 False 
12 False 
13 False 
14  True 
dtype: bool 

и, наконец:

print(df[(mask)]) 

Выход:

        business 
0     [Fast Food, Restaurants] 
14 [Burgers, Breakfast & Brunch, American] 
+0

это не работает (показывает нуль строки), этот, однако, выводит первую строку, но это не то, что я хочу 'df1 = business_df.ix [(business_df ['categories']. apply (pd.Series) .isin (restaurant_categories_list) .sum())] print (df1 ['categories']) ' – severine

+0

сделать рассол вашего DF и загрузить его где-нибудь, чтобы я мог его протестировать – MaxU

+0

вы забыли'> 0' после суммы - это имеет значение – MaxU

Смежные вопросы