#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(данные, индекс = индекс, столбцы = столбцы) Но поскольку ваш легче понять, я просто это сделаю!