#python #pandas #series #dictionary-comprehension
#python #pandas #Серии #понимание словаря
Вопрос:
У меня есть следующий фрейм данных
df = pd.DataFrame({'col_1': ['Animal','Deer','Sheep','Fish','Vehicle','Truck','Car','Mineral','Gold','Silver'],
'col_2': ['Animal',0.5,0.25,0.25,'Vehicle',0.5,0.5,'Mineral',0.75,0.25],
'Group': [0,0,0,0,1,1,1,2,2,2]})
Я хочу создать словарь рядов. Я хочу, чтобы столбец 1 был индексом, столбец 2 — значением и группой для указания ряда. НАПРИМЕР, имя (ключ) для первой серии будет «Animal», и оно должно выглядеть так:
Я попробовал следующее. Но это неправильно, я получаю словарь фреймов данных вместо рядов, а заголовки находятся в первой строке.
dict_of_series = {i: df.loc[df.group == i, ['col_1', 'col_2']] for i in range(1, df.group.iat[-1])}
Комментарии:
1. Можете ли вы указать ожидаемый результат
Ответ №1:
Используйте сопоставление словаря для цикла по groupby
объекту с DataFrame.set_axis
помощью для набора имен столбцов по первой строке для групп, удаления первой строки и последнего столбца путем индексации DataFrame.iloc
и последнего удаления имен столбцов в DataFrame.rename_axis
:
dict_of_series = {g['col_2'].iat[0]:
g.set_axis(g.iloc[0], axis=1).iloc[1:, :-1].rename_axis(None, axis=1)
for i, g in df.groupby('Group')}
print (dict_of_series['Animal'])
Animal Animal
1 Deer 0.5
2 Sheep 0.25
3 Fish 0.25
print (dict_of_series['Vehicle'])
Vehicle Vehicle
5 Truck 0.5
6 Car 0.5
print (dict_of_series['Mineral'])
Mineral Mineral
8 Gold 0.75
9 Silver 0.25
Для серии используйте DataFrame.set_index
перед решением, а также измените iloc
для выбора последнего столбца на Series
и последний Series.rename_axis
:
df = df.set_index('col_1')
dict_of_series = {g['col_2'].iat[0]:
g.set_axis(g.iloc[0], axis=1).iloc[1:, 0].rename_axis(None)
for i, g in df.groupby('Group')}
print (dict_of_series['Animal'])
Deer 0.5
Sheep 0.25
Fish 0.25
Name: Animal, dtype: object
Комментарии:
1. работает отлично, можете ли вы помочь мне понять понимание словаря? Например, что делает «i, g в df.groupby (‘Group’)»? Откуда python знает, что такое i и что такое g? и я привык помещать агрегатор в конец groupby.
2. Это словарь фреймов данных, и я ищу словарь рядов. Как мне переместить первый столбец в индекс в пределах понимания?
3. @JonathanHay — Вы правы, описание отсутствовало. Добавлено в ответ также для генерации рядов, таких как need.
4. Как это можно изменить для обработки дополнительной серии, в которой был только один элемент (например, Beef превращается в целое число и теряется)? Например, df = pd.DataFrame({‘col_1’: [‘Животное’, ‘Олень’, ‘Овца’, ‘Рыба’,’Транспортное средство’, ‘Грузовик’,’Автомобиль’, ‘Минерал’, ‘Золото’, ‘Серебро’,’Мясо’, говядина], ‘col_2’: [‘Животное’, 0,5,0,25, 0,25, ‘Транспортное средство’, 0,5,0,5, ‘Минерал’, 0,75,0,25, ‘Мясо’, 1], ‘Группа’: [0,0,0,0,1,1,1,2,2,2,3,3]})
5. @JonathanHay — Мне нужно уходить, извини. Можете ли вы опубликовать новый вопрос со ссылкой на это решение? У меня полные выходные, так что в понедельник могу это проверить.