Создать словарь из кадра данных pandas с несколькими столбцами, объединенными в качестве ключей, оставшимися столбцами в качестве значений? - PullRequest
1 голос
/ 30 сентября 2019

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

  1. Взять первые (x) столбцы и использовать точки данных в каждой из их строк вместе в качестве ключей.

  2. Составьте словарь для каждого ключа, используя оставшиеся точки данных в строке в качестве значений, в виде списка.

Давайте для простоты воспользуемся этим примером кадра данных.

  1. Создание кадра данных:
df = pd.DataFrame([
    {'c1':a1, 'c2':110, 'c3':'xyz', 'c4':24}, 
    {'c1':b2,'c2':100, 'c3':'jdf', 'c4':15}, 
    {'c1':a1,'c2':110, 'c3':'kjl', 'c4':125},
    {'c1':b2, 'c2':100, 'c3':'abc', 'c4':71},
])

    c1  c2  c3  c4
0   a1  110 xyz 24
1   b2  100 jdf 15
2   a1  110 kjl 125
3   b2  100 abc 71

Получите следующее:
new_dict = some code

new_dict

{('a1', 110): [['xyz', 24], ['kjl', 125]], ('b2', 100): [['jdf', 15], ['abc', 71]]}

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

Я могу скомпилировать словарь с одним столбцом в качестве ключа и всем остальным по мере необходимости, например:

test_dict = {}
for index, row in df.iterrows():
    if row['c1'] in test_dict:
        test_dict[row['c1']].append([row['c2'], row['c3'], row['c4']])
    else:
        test_dict[row['c1']] = []
        test_dict[row['c1']].append([row['c2'], row['c3'], row['c4']])

Но я не могу сделать переход к объединениюнесколько столбцов в качестве ключа.

Ответы [ 4 ]

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

Предполагая следующий DataFrame:

import pandas as pd

df = pd.DataFrame([
    {'c1': 'a1', 'c2': 110, 'c3': 'xyz', 'c4': 24},
    {'c1': 'b2', 'c2': 100, 'c3': 'jdf', 'c4': 15},
    {'c1': 'a1', 'c2': 110, 'c3': 'kjl', 'c4': 125},
    {'c1': 'b2', 'c2': 100, 'c3': 'abc', 'c4': 71},
])

Вы можете groupby , агрегировать и затем преобразовать в словарь ( to_dict ):

groups = df.groupby(['c1', 'c2']).apply(lambda x: x[['c3', 'c4']].values.tolist()).to_dict()
print(groups)

Выход

{('a1', 110): [['xyz', 24], ['kjl', 125]], ('b2', 100): [['jdf', 15], ['abc', 71]]}
0 голосов
/ 30 сентября 2019

Данные, которые вы использовали для создания фрейма данных, не соответствуют фрейму данных, который вы представляете в качестве примера, но то, что вы, похоже, хотите, можно сделать с помощью:

x = 2
key_cols =  list(df.columns[:x])
value_cols = df.columns[x:]
new_dict = df.groupby(key_cols).apply(lambda sub_df: sub_df[value_cols].values.tolist()).to_dict()
0 голосов
/ 30 сентября 2019

Вы можете попробовать это groupby:

(df.groupby(['c1','c2'])
   .apply(lambda x: x[['c3','c4']].values)
   .to_dict()
)

Вывод:

{('a1', 110): array([['xyz', 24],
        ['kjl', 125]], dtype=object), ('b2', 100): array([['jdf', 15],
        ['abc', 71]], dtype=object)}
0 голосов
/ 30 сентября 2019
test_dict = {}
for index, row in df.iterrows():
    if (row['c1'], row['c2']) in test_dict:
        test_dict[(row['c1'], row['c2'])].append([row['c3'], row['c4']])
    else:
        test_dict[(row['c1'], row['c2'])] = [[row['c3'], row['c4']]]

test_dict

{('a1', 100): [['xyz', 24], ['kjl', 125]], ('b2', 110): [['jdf', 15], ['abc', 71]]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...