У меня есть случай конвертации данных в словарь и возврата словаря обратно в тот же формат данных. Мне удалось выяснить, как преобразовать фрейм данных в требуемый формат словаря, который я хотел. Но, наоборот, я застрял.

>>> df
    C1 C2 C3
0  foo  H  C
1  foo  D  E
2  bar  F  G
3  bar  E  E
4  foo  F  G

>>> df['temp'] = df[['C2','C3']].apply(lambda x: {x[0]:x[1]},axis=1)
>>> df
    C1 C2 C3          temp
0  foo  H  C  {u'H': u'C'}
1  foo  D  E  {u'D': u'E'}
2  bar  F  G  {u'F': u'G'}
3  bar  E  E  {u'E': u'E'}
4  foo  F  G  {u'F': u'G'}

>>> df.groupby('C1')['temp'].apply(list)
C1
bar                  [{u'F': u'G'}, {u'E': u'E'}]
foo    [{u'H': u'C'}, {u'D': u'E'}, {u'F': u'G'}]
Name: temp, dtype: object

>>> df.groupby('C1')['temp'].apply(list).to_dict()
{'foo': [{'H': 'C'}, {'D': 'E'}, {'F': 'G'}], 'bar': [{'F': 'G'}, {'E': 'E'}]}

После процесса я получу словарь чего-то похожего и немного изменивший значения. поэтому я хотел восстановить кадр данных обратно.

Когда я реконструирую,

>>>pd.series({'foo': [{'H': 'C'}, {'D': 'E'}, {'F': 'G'}], 
                           'bar': [{'F': 'G'}, {'E': 'E'}]})

bar                  [{u'F': u'G'}, {u'E': u'E'}]
foo    [{u'H': u'C'}, {u'D': u'E'}, {u'F': u'G'}]
dtype: object

Я понятия не имею, после этого ..

1
WoodChopper 19 Дек 2015 в 22:23

3 ответа

Лучший ответ

Учитывая ваш измененный словарь d, вы можете использовать понимание списка, чтобы создать новый фрейм данных.

df_col_names = df.columns[:3]  # Use the first three column names to match output.
>>> pd.DataFrame([(c1, sub_dict.keys()[0], sub_dict.values()[0]) 
                  for c1 in d.keys()
                  for sub_dict in d[c1]], 
                 columns=df_col_names)

    C1 C2 C3
0  foo  H  C
1  foo  D  E
2  foo  F  G
3  bar  F  G
4  bar  E  E
1
Alexander 19 Дек 2015 в 21:16

Это то, что вы хотите?

dict = {'foo': [{'H': 'C'}, {'D': 'E'}, {'F': 'G'}], 'bar': [{'F': 'G'}, {'E': 'E'}]}
count = 0
for k,v in dict.items():
    for ele in v:
        for key, val in ele.items():
            print(count, k, "\t", key, "\t", val)
            count += 1

Пример вывода:

0 bar    F   G  
1 bar    E   E  
2 foo    H   C  
3 foo    D   E  
4 foo    F   G  
1
kmario23 19 Дек 2015 в 19:54
df_dict = df.groupby('C1')[['C2', 'C3']].apply(lambda x: {k:v for k, v in x.to_records(index=False) for l in x}).to_dict()

{'foo': {'D': 'E', 'F': 'G', 'H': 'C'}, 'bar': {'E': 'E', 'F': 'G'}}

new_df = pd.DataFrame()
for k, v in df_dict.items():
    for v1, v2 in v.items():
        new_df = pd.concat([new_df, pd.DataFrame(columns=[k], data=[v1, v2], index=['C2', 'C3'])], axis=1)

print(new_df.T.reset_index().rename(columns={'index':'C1'}))

    C1 C2 C3
0  bar  F  G
1  bar  E  E
2  foo  F  G
3  foo  D  E
4  foo  H  C
1
Stefan 19 Дек 2015 в 21:47