解压熊猫数据框字典 (1,1)
Posted
技术标签:
【中文标题】解压熊猫数据框字典 (1,1)【英文标题】:Unpack a dictionary of pandas data frames (1,1) 【发布时间】:2019-07-13 08:43:37 【问题描述】:我的字典将 (item, field) 元组作为键,将 (1,1) 数据帧作为值,列等于元组 (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
这是字典:
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()
【问题讨论】:
你能写一些东西来重建输入数据字典在 Python 代码中的样子吗?努力从问题中完全理解 @SvenHarris 我更新了帖子 【参考方案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
根据您的问题,我不知道您希望命名不同的列或索引。我也不知道在分组数据帧上运行什么类型的聚合函数。
【讨论】:
抱歉,想要 output.columns = ['CHG_PCT_1D', 'PX_LAST'] 并从输出中完全删除日期。 我已更新我的代码以解决您的评论。该解决方案基于此处找到的代码:***.com/a/13053267/1301888以上是关于解压熊猫数据框字典 (1,1)的主要内容,如果未能解决你的问题,请参考以下文章