Как создать словарь рядов с индексом из фрейма данных в python

#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 — Мне нужно уходить, извини. Можете ли вы опубликовать новый вопрос со ссылкой на это решение? У меня полные выходные, так что в понедельник могу это проверить.