我有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]
吗?
答案 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