Установить индексы датафрейма как единый ключ в словаре

1

У меня есть данные, такие как:

df = {'index': [0, 0, 0, 0, 0, 1,1,1,1,1, 2,2,2,2], 'value': ['val1', 'val2', 'val3', 'val4', 'val5', 'val6','val7','val8','val9','val10', 'val11','val12','val13','val14']}

Я хотел бы получить словарь, в котором каждый индекс стал бы ключевым в моем словаре, так что: key = 0 и values = ['val1', 'val2', 'val3', 'val4', 'val5']

Есть идеи как это сделать? Я использовал to_dict, но, похоже, я не делаю то, что мне нужно.

Теги:
pandas
dataframe
dictionary

3 ответа

2

Используйте groupby и apply, после чего последним to_dict.

df.groupby('index').value.apply(list).to_dict()
# {0: ['val1', 'val2', 'val3', 'val4', 'val5'],
#  1: ['val6', 'val7', 'val8', 'val9', 'val10'],
#  2: ['val11', 'val12', 'val13', 'val14']}

Другой вариант - перебирать строки и добавлять значения в словарь с помощью setdefault.

d = {}
for k, v in zip(df['index'], df.value):
    d.setdefault(k, []).append(v)

print(d)
# {0: ['val1', 'val2', 'val3', 'val4', 'val5'],
#  1: ['val6', 'val7', 'val8', 'val9', 'val10'],
#  2: ['val11', 'val12', 'val13', 'val14']}

Мои тесты показывают, что это на самом деле более эффективно, чем при groupby для кадров среднего размера. Это также сохранит порядок значений, в то время как groupby выполняет сортировку (является ли она стабильной или нет, это деталь реализации).

  • 0
    найти все :-) ~
2

Я могу думать о чем-то вроде:

import pandas as pd
df = pd.DataFrame({'index': [0, 0, 0, 0, 0, 1,1,1,1,1, 2,2,2,2], 'value': ['val1', 'val2', 'val3', 'val4', 'val5', 'val6','val7','val8','val9','val10', 'val11','val12','val13','val14']})
df.groupby(by='index').apply(lambda x: list(x['value'])).to_dict()

Выход:

{0: ['val1', 'val2', 'val3', 'val4', 'val5'],
 1: ['val6', 'val7', 'val8', 'val9', 'val10'],
 2: ['val11', 'val12', 'val13', 'val14']}
  • 0
    благодарю вас. Теперь я хотел бы записать это в файл json, но мои ключи теперь интерпретируются как целые и должны быть строками. Как я могу сделать?
  • 0
    Вы можете import json а затем json.dumps(var1) . должно быть что-то вроде '{"0": ["val1", "val2", "val3", "val4", "val5"], "1": ["val6", "val7", "val8", "val9", "val10"], "2": ["val11", "val12", "val13", "val14"]}'
1

Использование itertools

import itertools
l=df.sort_values('index').values.tolist()
d={k: [x[1] for x in g] for k, g in itertools.groupby(l,lambda x : x[0])}
d
{0: ['val1', 'val2', 'val3', 'val4', 'val5'], 1: ['val6', 'val7', 'val8', 'val9', 'val10'], 2: ['val11', 'val12', 'val13', 'val14']}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню