Создание фрейма данных из словаря с частично одинаковыми значениями

#pandas #dictionary

#pandas #словарь

Вопрос:

Я использую функцию для создания словаря с ключами и значениями. Некоторые значения уникальны, а другие нет. На самом деле я хочу использовать все уникальные значения в качестве индекса и ключей в качестве имен столбцов, если пара ключ: значение существует, заполните «x» в этой ячейке.

Псевдокод:

 def some_function():
   dict = create a dictionary
   print(dict)
   dataframe = create_Dataframe
   print(data_frame)

out:
{k1: [1,2,3,4], k2: [2,3,5,6]}

     k1    k2 
1    x     NaN   
2    x     x 
3    x     x   
4    x     Nan   
5    NaN   x
6    NaN   x  
 
 

Спасибо всем!

Ответ №1:

Хитрость заключается в создании словаря с ключами в виде кортежей (i, j) , где i значения будут попадать в индекс, а j значения будут попадать в столбцы. pd.Series конструктор создаст a pd.MultiIndex из кортежей с i на первом уровне и j на втором уровне. Когда мы unstack все будем в нужном месте.

Сопоставление вывода операционной системы

 pd.Series({(v, k): 'x' for k in out for v in out[k]}).unstack()

    k1   k2
1    x  NaN
2    x    x
3    x    x
4    x  NaN
5  NaN    x
6  NaN    x
 

единицы и нули (более разумно, imo)

 pd.Series({(v, k): 1 for k in out for v in out[k]}).unstack(fill_value=0)

   k1  k2
1   1   0
2   1   1
3   1   1
4   1   0
5   0   1
6   0   1
 

Настройка

 out = {'k1': [1,2,3,4], 'k2': [2,3,5,6]}
 

Ответ №2:

В качестве простого решения вы можете использовать:

Создание dict

 my_dict = {"k1": [1,2,3,4], "k2": [2,3,5,6]}
 

Создание пустого фрейма данных

 import itertools

idxs = sorted(list(set(itertools.chain.from_iterable(my_dict.values()))))
cols = list(my_dict.keys())

df = pd.DataFrame(columns=cols, index=idxs)
 

Результат пока таков:

 print(df)

    k1   k2
1  NaN  NaN
2  NaN  NaN
3  NaN  NaN
4  NaN  NaN
5  NaN  NaN
6  NaN  NaN
 

Заполнение символом «x»

 for k, v in my_dict.items():
    df[k][v] = "x"
 

Результатом будет:

 print(df)

    k1   k2
1    x  NaN
2    x    x
3    x    x
4    x  NaN
5  NaN    x
6  NaN    x
 

Комментарии:

1. Спасибо за быстрый ответ, Пауло. Я сам нашел решение: dict_e = {‘k’:[1,2,4,6], ‘l’:[1,3,4,5]} индекс = сортировка ({x для v в dict_e.values() для x в v}) столбцы = список (dict_e.keys()) список 1 = список (карта (лямбда x: x в dict_e[‘k’], индекс)) список 2 = список (карта (лямбда x: x в val2, индекс)) данные = список (zip(список 1, список 2)) df = pd.DataFrame(данные, индекс = индекс, столбцы = столбцы) Но поскольку ваш легче понять, я просто это сделаю!