我的字典具有(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()
答案 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
根据您的问题,我不知道您要为不同的列或索引命名的含义。我也不知道在分组数据帧上运行哪种类型的聚合函数。