【问题标题】:assign values to dataframe defined by multiindex为多索引定义的数据框赋值
【发布时间】:2016-06-09 11:05:52
【问题描述】:

我有一个由

创建的 5 维 df
factor_list = ['factor1', 'factor2', 'factor3']
method_list = ['method1', 'method2', 'method3']

grouping_list = ['group1', 'group2', 'group3']

parameter_list = [1, 5, 10, 20, 40] 

iterables = [factor_list, method_list, parameter_list, grouping_list]

axis_names = ['factor', 'method', 'param', 'grouping']

multi_index = pd.MultiIndex.from_product(iterables, names=axis_names)

column_list = ['a', 'b', 'c', 'd', 'e']

results = pd.DataFrame(index=multi_index, columns=column_list)

results.sort_index(inplace=True)

那我做

slice = results.loc['factor2'].copy()

并将计算值填充到切片中(由函数完成)。
然后我发现我无法将结果复制回来

results.loc['factor2'] = slice 

以下行引发错误:

cannot align on a multi-index with out specifying the join levels

确切的问题是:
如何将 slice 中的内容复制回结果DataFramefactor2 部分?

【问题讨论】:

  • 如果有必要,发布一些样本可能会被屏蔽如何?

标签: python pandas dataframe multi-index


【解决方案1】:

对我来说,using slicersloc 一起工作:

import pandas as pd, numpy as np

factor_list = ['factor1', 'factor2', 'factor3']
method_list = ['method1', 'method2', 'method3']

grouping_list = ['group1', 'group2', 'group3']
strategy_list = ['s1', 's2', 's3']

parameter_list = [1, 5, 10, 20, 40]  # -999 mean not applicable

iterables = [factor_list, strategy_list, parameter_list, grouping_list]

axis_names = ['factor', 'method', 'param', 'grouping']

multi_index = pd.MultiIndex.from_product(iterables, names=axis_names)

column_list = ['a', 'b', 'c', 'd', 'e']

results = pd.DataFrame(np.arange(len(multi_index)*len(column_list)).reshape((len(multi_index),len(column_list))),
                       index=multi_index, columns=column_list)
results.sort_index(inplace=True)
print (results.head())
                                a   b   c   d   e
factor  method param grouping                    
factor1 s1     1     group1     0   1   2   3   4
                     group2     5   6   7   8   9
                     group3    10  11  12  13  14
               5     group1    15  16  17  18  19
                     group2    20  21  22  23  24

idx = pd.IndexSlice
sli = results.loc[idx['factor1',:,:,['group1','group3']],:]

#some test function
sli = sli + 0.1
print (sli.head())
                                  a     b     c     d     e
factor  method param grouping                              
factor1 s1     1     group1     0.1   1.1   2.1   3.1   4.1
                     group3    10.1  11.1  12.1  13.1  14.1
               5     group1    15.1  16.1  17.1  18.1  19.1
                     group3    25.1  26.1  27.1  28.1  29.1
               10    group1    30.1  31.1  32.1  33.1  34.1

results.loc[idx['factor1',:,:,['group1','group3']],:] = sli 
print (results.head())
                                  a     b     c     d     e
factor  method param grouping                              
factor1 s1     1     group1     0.1   1.1   2.1   3.1   4.1
                     group2     5.0   6.0   7.0   8.0   9.0
                     group3    10.1  11.1  12.1  13.1  14.1
               5     group1    15.1  16.1  17.1  18.1  19.1
                     group2    20.0  21.0  22.0  23.0  24.0

【讨论】:

  • 谢谢,我自己也通过 results.loc['factor2'].loc[slice.index] = slice
  • 感谢您的接受。我用column_list 中的双b 列测试了您的第一个版本script,它真的不起作用,我很长时间都找不到问题;)。美好的一天!
猜你喜欢
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2021-12-08
  • 2017-05-10
  • 2014-11-15
  • 2020-10-23
相关资源
最近更新 更多