Преобразование вложенных списков и словаря в Dataframe? - PullRequest
1 голос
/ 07 мая 2019

У меня есть словарь с тысячами ключей, например:

 my_dictionary:
                {'key1':[['ft1',[2,4,12,2]],['ft2',[0,3,3,1]],'key2':[['ft1',[5,0,2,9]],['ft2',[10,39,3,2]]}

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

 my_new_dataframe:
             ID, ft1_sig,ft1_med,ft1_les,ft1_non,ft2_sig,ft2_med,ft2_les,ft2_non,... 
             key1    2       4      12      2       0       3       3.     1
             key2    5.      0.      2.     9.      10.     39     3.     2
             ...
             keyn.  ..       ..      ..     ..

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Я добавил больше данных в ваш пример, чтобы показать, что скрипт будет гибким, если будут добавлены новые функции или строки (ключи).

  • Собрать все функции в списке (имя)
  • Получить только список номеров
  • Назначение новых имен столбцов
  • Создать функцию, которая будет возвращать каждый элемент в списке номеров
  • Используйте функцию apply для создания новых столбцов
  • Удалить / удалить временные столбцы

Вот оно,

mydict = {'key1':[['ft1',[2,4,12,2]],['ft2',[0,3,3,1]],['ft3',[0,3,3,1]]],
          'key2':[['ft1',[5,0,2,9]],['ft2',[10,39,3,2]],['ft3',[0,3,3,1]]]
         ,'key3':[['ft1',[5,0,2,9]],['ft2',[10,39,3,2]],['ft3',[0,3,3,1]]]} 
df = pd.DataFrame(mydict).T 
colname = [df[c][0][0] for c in df]
df = df.applymap(lambda c: c[1])
df.reset_index(level=0, inplace=True)
df.columns=['ID'] + colname
s=['_sig','_med','_les','_non']
def f(x):
    return pd.Series([x[0], x[1], x[2], x[3]])
for col in colname:
    df[[col+'_sig', col+'_med', col+'_les', col+'_non']]= df[col].apply(lambda x: f(x))
df.drop(colname, axis=1, inplace=True)
df

Результат:

     ID ft1_sig ft1_med ft1_les ft1_non ft2_sig ft2_med ft2_les ft2_non ft3_sig ft3_med ft3_les ft3_non
0   key1    2    4  12  2    0   3  3   1   0   3   3   1
1   key2    5    0   2  9   10  39  3   2   0   3   3   1
2   key3    5    0   2  9   10  39  3   2   0   3   3   1
1 голос
/ 07 мая 2019

Я попытался решить эту проблему, но он требует, чтобы каждый из ключей (т. Е. Key1, key2 и т. Д.) Содержал атрибут ft, который вы хотите в словаре.Кроме того, вам не хватает "]" для первоначального списка?Это было несоответствие, когда я вставил в мой переводчик.

import pandas as pd

#added method to change your original dictionary to one that I can manipulate with the method below.

#If you compare the values of new_dict and data using ==, it returns true.
my_dictionary = {'key1':[['ft1',[2,4,12,2]],['ft2',[0,3,3,1]]],'key2':[['ft1',[5,0,2,9]],['ft2',[10,39,3,2]]]}

new_dict ={}
for element in my_dictionary:
    print(element)
    print(my_dictionary[element])
    new_dict[element] = dict(my_dictionary[element])
    print(new_dict)

data = {
    'key1':{
        'ft1':[2,4,12,2],
        'ft2':[0,3,3,1]
        },
    'key2':{
        'ft1':[5,0,2,9],
        'ft2':[10,39,3,2]
        }
    }

keys = list(data.keys())

df = pd.DataFrame.from_dict(data).T

df2 = pd.DataFrame(df.ft1.values.tolist()).add_prefix('ft1_')
df3 = pd.DataFrame(df.ft2.values.tolist()).add_prefix('ft2_')
df4 = pd.merge(df2,df3,left_index=True,right_index=True)
df4.index=keys

print(df4)

Вот вывод:

enter image description here

...