Извлечение кортежей из списка в Pandas Dataframe - PullRequest
1 голос
/ 29 сентября 2019

У меня есть датафрейм с 12 столбцами.Я хотел бы извлечь строки столбца в зависимости от значений другого столбца.

Пример моего фрейма данных

order_id    order_type   order_items
45           Lunch       [('Burger', 5), ('Fries', 6)]
12           Dinner      [('Shrimp', 10), ('Fish&Chips', 7)]
44           Lunch       [('Salad', 9), ('Steak', 9)]
23           Breakfast   [('Coffee', 2), ('Eggs', 3)]

Я бы хотел извлечь меню завтрака, обеда и ужина с помощьюизвлечение первого элемента каждого tuple.и извлекаем количество заказов из следующего элемента в кортеже.

Каждый элемент является строкой типа в соответствии с этой строкой кода

print(type(df['order_items'][0]))
>> <class 'str'>

Я пытался применить фильтр для извлечения завтракаmenu:

BreakfastLst=df.loc[df['order_type'] == 'Breakfast']['order_items']

, но вывод выглядит следующим образом, и я не могу использовать for loop для перебора списков и доступа к кортежам.

2                           [('Coffee', 4), ('Eggs', 7)]
7                           [('Coffee', 2), ('Eggs', 3)]
8      [('Cereal', 7), ('Pancake', 8), ('Coffee', 4),...
9      [('Cereal', 3), ('Eggs', 1), ('Coffee', 1), ('...

Я также пыталсяпреобразуйте в lists:

orderTypeLst = df(['order_type'])['order_items'].apply(list)

и затем извлеките списки, выполнив это:

breakFast=orderTypeLst['Breakfast']
lunch=orderTypeLst['Lunch']
dinner=orderTypeLst['Dinner']

, но на выходе получится строка.И я не могу повторить это тоже.

["[('Coffee', 4), ('Eggs', 7)]",
 "[('Coffee', 2), ('Eggs', 3)]",
 "[('Cereal', 7), ('Pancake', 8), ('Coffee', 4), ('Eggs', 8)]"]

Что касается dictionaries, я попробовал следующее, но вывод дублируется:

pd.Series(outlierFile.order_type.values,index=outlierFile.order_items).to_dict()

образец вывода

 "[('Fries', 1), ('Steak', 6), ('Salad', 8), ('Chicken', 10)]": 'Lunch',
 "[('Cereal', 6), ('Pancake', 8), ('Eggs', 3)]": 'Breakfast',
 "[('Shrimp', 9), ('Salmon', 9)]": 'Dinner',
 "[('Pancake', 3), ('Coffee', 5)]": 'Breakfast',
 "[('Eggs', 1), ('Pancake', 1), ('Coffee', 5), ('Cereal', 5)]": 'Breakfast'

мой желаемый вывод - эточистая версия каждого order_type (список или словарь), чтобы я мог перебирать кортежи и извлекать необходимые элементы.

Любой ввод будет полезен. Спасибо,

1 Ответ

1 голос
/ 29 сентября 2019

IIUC, попробуйте использовать pandas.DataFrame.groupby после оценки:

my_dict = df.groupby('order_type')['order_items'].apply(lambda x: sum(x, [])).to_dict()
print(my_dict)

Вывод:

{'Breakfast': [('Coffee', 2), ('Eggs', 3)],
 'Dinner': [('Shrimp', 10), ('Fish&Chips', 7)],
 'Lunch': [('Burger', 5), ('Fries', 6), ('Salad', 9), ('Steak', 9)]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...