Проблемы с преобразованием списков из массивного словаря в датафреймы - PullRequest
0 голосов
/ 04 сентября 2018

Я создал словарь следующим образом:

Данные выглядят так:

GDS3:
ABC_1     ABC_2     BBB_1
cat        elf       123
dog        run       456
bird       burp      789

GDS4:
ABC_3     ABC_4     BCB_a
beer        yes      234
wine        no       543
gin         yes      743

GDS5:
ABC_5     ABC_6     BCD_c
lol        yea       543
lmao       NaN       446
asl        NaN       777

#create a dictionary in which all columns that start with the same 3 characters will be grouped in the same key. 
dict_2013 = {k: g for k, g in GDS3.groupby(by=lambda x: x[:3].lower(), axis=1)}

dict_2014 = {k: g for k, g in GDS4.groupby(by=lambda x: x[:3].lower(), axis=1)}

dict_2015 = {k: g for k, g in GDS5.groupby(by=lambda x: x[:3].lower(), axis=1)}

#start with year 2013:
global_dict=dict_2013

#if key in the new dictionary is in the old dictionary then 
#add the values from the new dictionary key to the old dictionary key
#else if the new dictionary key does not exist in the old dictionary then add a new key with the new values

for key,val in dict_2014.items():
    if key in global_dict:
       global_dict[key]=[global_dict[key],val]
    else:
       global_dict[key]=val

for key,val in dict_2015.items():#to add items
    if key in global_dict:
        global_dict[key]=[global_dict[key],val]
    else:
       global_dict[key]=val

Это мой желаемый вывод (кадр данных для каждой клавиши)

  df_ABC:
  ABC_1     ABC_2     ABC_3   ABC_4   ABC_5
  cat        elf       beer    yes    lol
  dog        run       win     no     lmao
  bird       burp      gin     yes    asl

  df_BBB:
  BBB_1
  cat   
  dog        
  bird      

Другими словами, я хочу преобразовать отдельные ключи в отдельные словари (ДЛЯ ВСЕХ КЛЮЧЕЙ), поэтому я попробовал следующее:

ABC_dataframe=pd.DataFrame(global_dict['ABC'])

Когда я делаю это, я получаю следующую ошибку:

TypeError: Expected list, got DataFrame

Что странно, потому что global_dict ['ABC'] - это список. (Я проверил, используя тип (global_dict ['ABC']).

Что я могу сделать, чтобы исправить это? Я попытался сгладить список, но у меня все еще есть проблемы.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы можете сделать это, используя pd.concat и groupby, если GDS3, GDS4 и GSD5 уже являются фреймами данных:

tdf = pd.concat([GDS3, GDS4, GDS5], axis=1)

g = tdf.groupby(tdf.columns.str[:3], axis=1)

# Now, let's create a dictionary of dataframes grouped 
# by the first three letters of each column.

df_list = {}
for n, i in g:
    df_list[n] = i


print(df_list['ABC'])
print(df_list['BBB'])

Или, как @jpp предлагает использовать:

dict_dfs = dict(tuple(g))

print(dict_dfs['ABC'])
print(dict_dfs['BBB'])

Выход:

  ABC_1 ABC_2 ABC_3 ABC_4 ABC_5 ABC_6
0   cat   elf  beer   yes   lol   yea
1   dog   run  wine    no  lmao   NaN
2  bird  burp   gin   yes   asl   NaN
   BBB_1
0    123
1    456
2    789
0 голосов
/ 04 сентября 2018

Самая запутанная часть вашей логики - наличие global_dict значений либо в виде фрейма данных, либо в виде списка. Поддерживать согласованность типов объектов; выберите список и добавляйте к нему каждый раз, когда хотите добавить значение.

Решение Pythonic заключается в использовании collections.defaultdict из list объектов:

from collections import defaultdict

global_dict = defaultdict(list, {k: [v] for k, v in dict_2013.items()})

for key,val in dict_2014.items():
    global_dict[key].append(val)

for key,val in dict_2015.items():
    global_dict[key].append(val)

Затем используйте pd.concat вдоль axis=1:

abc = pd.concat(global_dict['abc'], axis=1)

print(abc)

  ABC_1 ABC_2 ABC_3 ABC_4 ABC_5 ABC_6
0   cat   elf  beer   yes   lol   yea
1   dog   run  wine    no  lmao   NaN
2  bird  burp   gin   yes   asl   NaN

Я не могу объяснить, почему ваш желаемый результат отсутствует ABC_6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...