如何在将值和句点分开的同时将Pandas MultiIndex / PeriodIndex转换为Dict

时间:2018-07-22 00:09:54

标签: python pandas serialization

如何完成将熊猫多索引数据框转换为相应的dict输出的操作。示例,尝试和预期的输出如下。

示例数据:

import numpy as np
import pandas as pd

# Setup Data/Define Helper func for Dict -> Multi-Index DF

def dict_to_multiDF_format(dictionary: dict) -> Dict:
    return {(outerKey, innerKey): values for outerKey, innerDict in dictionary.items() for innerKey, values in
           innerDict.items()}

d = {
    'x': {'y': np.random.rand(4), 'z': np.random.randn(4)},
    'aa': {'y': np.random.rand(4), 'z': np.random.randn(4)}
    }

# Create DF w/ PeriodIndex
df = pd.DataFrame(dict_to_multiDF_format(d))
df.index = pd.PeriodIndex(start='01-2018', end='04-2018', freq='M')

现在已经创建了DF,我希望能够将其恢复为多级dict格式。我从另一个SO答案中修改了以下内容,这使我几乎可以实现:

def multiDF_to_dict(df: pd.DataFrame) -> dict:
    return df.T.groupby(level=0).apply(lambda df: df.xs(df.name).to_dict('index')).to_dict()

这时,生成的dict类型映射将为Dict [str,Dict [str,Dict [pd.Period,float]]]]。我想返回的是Dict [str,Dict [str,List [float]]],在上面的示例中,我可以调用:

output = multiDF_to_dict(df)

# the following to be True
isinstance(output['x']['z'], list)
isinstance(output['x']['z'][0], float)

isinstance(output['periods'], list)
isinstance(output['periods'][0], pd.Period)

请注意,pd.Period已作为外部dict项移动,因为它适用于所有值。

编辑:为了更好地解释输出,上面的输出dict返回:

In[163]: output['x']['z']
Out[163]: 
{Period('2018-01', 'M'): 1.0308097883976446,
 Period('2018-02', 'M'): 0.6475015766242127,
 Period('2018-03', 'M'): 0.6703669301328639,
 Period('2018-04', 'M'): -0.9079304895787961}

我希望通过相同的电话返回:

[1.0308097883976446, 0.6475015766242127, 0.6703669301328639,-0.9079304895787961]

In[164]: output['periods'] # from PeriodIndex
Out[164]: ['2018-01', '2018-02', '2018-03', '2018-04']

谢谢!

0 个答案:

没有答案