У меня есть случай конвертации данных в словарь и возврата словаря обратно в тот же формат данных. Мне удалось выяснить, как преобразовать фрейм данных в требуемый формат словаря, который я хотел. Но, наоборот, я застрял.
>>> 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
Я понятия не имею, после этого ..
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
Это то, что вы хотите?
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
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
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.