Python dict со значениями как кортежи для pandas DataFrame
У меня есть следующий dict:
td = {'q1':(111,222), 'q2':(333,444)}
Я хотел бы преобразовать его в dataframe, который выглядит так:
Query Value1 Value2
q1 111 222
q2 333 444
Я пробовал следующее:
df = pd.DataFrame(td.items())
Результат выглядит следующим образом:
0 1
0 q1 (111,222)
1 q2 (333,444)
Если это было не совсем очевидно, я новичок в python и pandas. Как я могу получить словарь со значениями как кортежи, чтобы вести себя как отдельные столбцы в фрейме данных?
Моя конечная цель - показать процентную разницу между значением1 и значением2.
Ответы
Ответ 1
Настройка
td = {'q1':(111,222), 'q2':(333,444)}
Вариант 1
pd.DataFrame(td).T.rename_axis('Query').add_prefix('Value').reset_index()
Query Value0 Value1
0 q1 111 222
1 q2 333 444
Вариант 2
from cytoolz.dicttoolz import merge
pd.DataFrame(
[merge(
{'Query': k},
{'Value{}'.format(i): x for i, x in enumerate(v, 1)}
) for k, v in td.items()]
)
Query Value1 Value2
0 q1 111 222
1 q2 333 444
Ответ на комментарий
df = pd.DataFrame(td).T.rename_axis('Query').add_prefix('Value')
df.assign(PctChg=df.pct_change(axis=1).iloc[:, -1]).reset_index()
Query Value0 Value1 PctChg
0 q1 111 222 1.000000
1 q2 333 444 0.333333
или
df = pd.DataFrame(td).T.rename_axis('Query').add_prefix('Value')
df.eval('PctChg = Value1 / Value0 - 1', inplace=False).reset_index()
Query Value0 Value1 PctChg
0 q1 111 222 1.000000
1 q2 333 444 0.333333
Ответ 2
Попробуй?
td = {'q1':(111,222), 'q2':(333,444)}
df = pd.DataFrame(td).T
df
Out[25]:
0 1
q1 111 222
q2 333 444
Ответ 3
Использование from_dict
:
pd.DataFrame.from_dict({'q1':(111,222), 'q2':(333,444)}, orient='index')
Возврат:
0 1
q1 111 222
q2 333 444
Вставьте несколько форматирования:
df.columns = 'Value' + df.columns.to_series().add(1).astype(str)
df.index.name = 'Query'
Вы получаете:
Value1 Value2
Query
q1 111 222
q2 333 444
Ответ 4
Вы можете определить data
и index
, используя итераторы словаря:
import pandas as pd
td = {'q1':(111,222), 'q2':(333,444)}
pd.DataFrame(data=list(td.values()), index=list(td.keys()))
должен создать DataFrame:
0 1
q1 111 222
q2 333 444