Это не дубликат
Этот вопрос: Pandas столбец dict разделен на новый столбец и строки не отвечает на вопрос в этом сообщении. Я включил подход к преобразованию столбца словарей в информационный фрейм в конце этого поста, это не то, что я нахожу здесь трудным.
Настройка
Учитывая следующие данные:
d1 = {'a' : 12, 'b' : 44}
d2 = {'this' : 9, 'that' : 33, 'there' : 82}
d3 = {'x' : 19, 'y' : 38, 'z' : 12, 't' : 90}
df = pd.DataFrame(dict(
var_1 = [1,2,3],
var_2 = ['one', 'two', 'four'],
var_3 = [d1, d2, d3]
))
Что выглядит как:
var_1 var_2 var_3
0 1 one {'a': 12, 'b': 44}
1 2 two {'this': 9, 'that': 33, 'there': 82}
2 3 four {'x': 19, 'y': 38, 'z': 12, 't': 90}
Я хотел бы иметь возможность .melt
, в частности id_vars
, таким способом, который также извлекает словари из столбца var_3
.
Использование просто первой строки:
var_1 var_2 var_3
0 1 one {'a': 12, 'b': 44}
Ожидаемый промежуточный результат будет:
var_1 var_2 key value
0 1 one a 12
1 1 one b 44
После плавления это будет:
# using df.melt(id_vars = ['var_1', 'var_2'])
var_1 var_2 variable value
0 1 one key a
1 1 one key b
2 1 one value 12
3 1 one value 44
Я хотел бы сделать это для всех данных.
Попытка
Если честно, я совершенно не уверена, как go об этом.
# make key : value dataframe
row_i = 0
col_i = 2
key_value_df = (pd.DataFrame( df.iloc[ row_i, col_i], index= [0 ] )
.T.reset_index()
.rename(columns = {'index' : 'key', 0 : 'value'})
)
data_thing = (pd.concat( [pd.DataFrame(df.iloc[ 0 , [0,1]]
.to_dict(), index=[0])] * len(key_value_df) ))
Тогда
data_thing.join(key_value_df).reset_index(drop=True)
даст
var_1 var_2 key value
0 1 one a 12
1 1 one a 12
Но кажется, что его можно значительно улучшить, и я не уверен, что обобщу его на другие строки.
Редактировать
Я могу получить столбец словарей в виде фрейма данных, используя что-то например,
all_keys = functools.reduce(lambda x,y: x+y , [list(x.keys()) for x in var3])
all_values = functools.reduce(lambda x,y: x+y, [list(x.values()) for x in var3])
pd.DataFrame(dict( keys = all_keys, values = all_values ))
давая
keys values
0 a 12
1 b 44
2 this 9
3 that 33
4 there 82
5 x 19
6 y 38
7 z 12
8 t 90
Но это не отвечает на вопрос, который я задал