解压熊猫数据帧字典(1,1)

时间:2019-02-19 18:53:59

标签: python pandas

我的字典具有(item,field)元组作为键,并且(1,1)dataframes作为值,列等于tuples(item,field),行索引作为单个日期(所有项目都相同),例如:

Key
('AB US Equity', 'CHG_PCT_1D')
('AB US Equity', 'PX_LAST')
('IBM US Equity', 'CHG_PCT_1D')
('IBM US Equity', 'PX_LAST')

Value   
    ('AB US Equity', 'CHG_PCT_1D')
2/15/2019   0.5362

('AB US Equity', 'PX_LAST')
2/15/2019   30

这里是dic:

   In [100]: str(dic)
Out[100]: "{('IBM US Equity', 'PX_LAST'):             (IBM US Equity, PX_LAST)\n2019-02-15                    138.03, ('IBM US Equity', 'CHG_PCT_1D'):             (IBM US Equity, CHG_PCT_1D)\n2019-02-15                       1.1357, ('AB US Equity', 'PX_LAST'):             (AB US Equity, PX_LAST)\n2019-02-15                     30.0, ('AB US Equity', 'CHG_PCT_1D'):             (AB US Equity, CHG_PCT_1D)\n2019-02-15                      0.5362}"

以下代码将它们水平放置:

 output=pandas.concat(dic.values(),axis=1)
 output.columns=pandas.MultiIndex.from_tuples(output.columns)
 output.columns.names=['Item','Field']

在具有数百个项目和几个字段的情况下,我想用以下垂直平面df打开它:

   Value    CHG_PCT_1D  PX_LAST
AB US Equity    0.5362  30
IBM US Equity   1.1357  138.03

解决方案 (主要基于以下答案)

import pandas as pd

dic = {('IBM US Equity', 'PX_LAST'): '2019-02-15    138.03',
 ('IBM US Equity', 'CHG_PCT_1D'):           
 '2019-02-15                       1.1357',
 ('AB US Equity', 'PX_LAST'):             
 '2019-02-15                     30.0',
 ('AB US Equity', 'CHG_PCT_1D'):
 '2019-02-15                      0.5362'}

output = pd.DataFrame.from_dict(dic, orient = 'index')
# to series removing date
output = output[0].str.split().str[-1]
# unstack help, first example
index = pd.MultiIndex.from_tuples(output.index)
output = pd.Series(output.values, index=index).unstack()

1 个答案:

答案 0 :(得分:1)

请带上SO tour并了解How to Ask。这些将帮助您更快地收集有用的回复。

IIUC,您正在寻找unstack MultiIndex的最内层。这是我从您的问题中复制出来的代码:

dic = {('IBM US Equity', 'PX_LAST'): '2019-02-15                    138.03',
 ('IBM US Equity', 'CHG_PCT_1D'):           
 '2019-02-15                       1.1357',
 ('AB US Equity', 'PX_LAST'):             
 '2019-02-15                     30.0',
 ('AB US Equity', 'CHG_PCT_1D'):
 '2019-02-15                      0.5362'}

output = pd.DataFrame.from_dict(dic, orient = 'index')
output = output.reset_index()
output['a'] = output.apply(lambda row: row['index'][0], axis = 1)
output['b'] = output.apply(lambda row: row['index'][1], axis = 1)
output = output.drop(['index'], axis = 1)
output = output.groupby(['a', 'b']).sum().unstack()
output = output[0]
output['CHG_PCT_1D'] = output['CHG_PCT_1D'].str.split().str[-1]
output['PX_LAST'] = output['PX_LAST'].str.split().str[-1]

因此,当您运行output.to_string()时,您会得到:

b             CHG_PCT_1D PX_LAST
a                               
AB US Equity      0.5362    30.0
IBM US Equity     1.1357  138.03

根据您的问题,我不知道您要为不同的列或索引命名的含义。我也不知道在分组数据帧上运行哪种类型的聚合函数。