如何完成将熊猫多索引数据框转换为相应的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']
谢谢!