解压熊猫数据框字典 (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)的主要内容,如果未能解决你的问题,请参考以下文章

熊猫数据框到字典

从多个字典填充熊猫数据框

熊猫数据框中的字典列

如何将包含元组列表的字典中的字典转换为熊猫数据框

将命名元组嵌套字典到熊猫数据框

如何将嵌套字典转换为熊猫数据框?