用multindex列填充数据框

时间:2019-12-23 07:32:55

标签: python pandas

我有neat solution to my simpler problem在两个数据帧之间做一些矢量化算法。基本技巧是先用一个数据帧中的值预先填充最终数据帧。

我的新情况是数据框具有multindex列,而不是简单的1级列。因此,我不清楚如何在使用multindex的数据框中从第一个问题强制熊猫执行相同的操作。

原始+更复杂的示例:

#the original solution
staff = {"mike": 18,  "matt": 22,  "dave": 25, "kanad": 15, 'elder':85}
staff_df = pd.DataFrame(data=staff, index = ['measurement'])
staff_df.index.name="evaluation"


the_data = {'m': [.5, .1, .3, .9, 1.2], 'b':[12, 14, 8, 10, 20]}
formula_df = pd.DataFrame(index=pd.date_range(start="20191201", periods=5, freq="d"),
                         data=the_data)
formula_df.index.name="Date"
final_df = pd.DataFrame(data=[staff_df.iloc[0].to_numpy()], 
                        index=formula_df.index, 
                        columns=staff_df.columns)
final_df = final_df.mul(formula_df['m'], axis=0).add(formula_df['b'], axis=0)



#with a mult-index column
arrays = [['mike', 'mike', 'matt', 'matt', 'dave','dave',  'elder','elder', ], ['day', 'night']*4, ]
cols = pd.MultiIndex.from_arrays(arrays, names=('name', 'period'), )
staff_df = pd.DataFrame(data= [[10,11, 13,8, 19,22, 7, 12]]  , columns=cols, index=["measurement"])
staff_df.index.names=["evaluation", ]

the_data = {'m': [.5, .1, .3, .9, 1.2], 'b':[12, 14, 8, 10, 20]}
formula_df = pd.DataFrame(index=pd.date_range(start="20191201", periods=5, freq="d"),
                         data=the_data)
formula_df.index.name="Date"


""" how to generate the final_df for this multi-index column example?"""

更新:

对不起,第二个“玩具”示例没有复制我的真实问题。使用新的多索引,有4(迈克,亚光,戴夫,卡纳德)x 2(白天,黑夜)= 8列数据。因此,在我的玩具中,我传递了一个8位数字的列表作为数据,因此没有问题。

但是在我的实际示例中,白天和黑夜级别的“ mike matt dave kand”级别的值都相同。因此,我只有四个要传递的数据点,而没有八个。我需要以某种方式正确地复制那些数据。

IE:在我的真实示例中:

fuel_gpw = pd.DataFrame(index=sulfur['asia'].index,
                       columns=yield_df.unstack(level=0).columns, 
                       data=[resid_df.iloc[0].to_numpy()])

列的长度为135(5x27),但数据仅为长度27,所以我得到了ValueError: 135 columns passed, passed data had 27 columns

我需要将[resid_df.iloc[0].to_numpy()][a,b,c,..z]复制到[a,a,a,a,a,b,b,b,b,b,....z,z,z,z,z]吗?

1 个答案:

答案 0 :(得分:0)

不确定是否理解,但对我来说,使用相同的解决方案:

final_df = pd.DataFrame(data=[staff_df.iloc[0].to_numpy()], 
                        index=formula_df.index, 
                        columns=staff_df.columns)
final_df = final_df.mul(formula_df['m'], axis=0).add(formula_df['b'], axis=0)
print (final_df)
name        mike        matt        dave       elder      
period       day night   day night   day night   day night
2019-12-01  17.0  17.5  18.5  16.0  21.5  23.0  15.5  18.0
2019-12-02  15.0  15.1  15.3  14.8  15.9  16.2  14.7  15.2
2019-12-03  11.0  11.3  11.9  10.4  13.7  14.6  10.1  11.6
2019-12-04  19.0  19.9  21.7  17.2  27.1  29.8  16.3  20.8
2019-12-05  32.0  33.2  35.6  29.6  42.8  46.4  28.4  34.4

编辑:

应该使用DataFrame.reindex

final_df = pd.DataFrame([[1,2,3,4]],
                       index=formula_df.index, 
                        columns=staff_df.columns.levels[0])

print (final_df)
name        dave  elder  matt  mike
Date                               
2019-12-01     1      2     3     4
2019-12-02     1      2     3     4
2019-12-03     1      2     3     4
2019-12-04     1      2     3     4
2019-12-05     1      2     3     4

final_df = final_df.reindex(staff_df.columns, level=0, axis=1)
print (final_df)
name       mike       matt       dave       elder      
period      day night  day night  day night   day night
Date                                                   
2019-12-01    4     4    3     3    1     1     2     2
2019-12-02    4     4    3     3    1     1     2     2
2019-12-03    4     4    3     3    1     1     2     2
2019-12-04    4     4    3     3    1     1     2     2
2019-12-05    4     4    3     3    1     1     2     2