Python 使用多索引列填充数据帧
我在两个数据帧之间做了一些矢量化算法。基本技巧是先用一个数据帧中的值预填充最终的数据帧 我的新情况是dataframe有一个多索引列,而不是一个简单的1级列。因此,我不清楚如何强制pandas在使用multindex的数据帧中执行我的第一个问题中的相同操作 原始+更复杂的示例:Python 使用多索引列填充数据帧,python,pandas,Python,Pandas,我在两个数据帧之间做了一些矢量化算法。基本技巧是先用一个数据帧中的值预填充最终的数据帧 我的新情况是dataframe有一个多索引列,而不是一个简单的1级列。因此,我不清楚如何强制pandas在使用multindex的数据帧中执行我的第一个问题中的相同操作 原始+更复杂的示例: #the original solution staff = {"mike": 18, "matt": 22, "dave": 25, "kanad": 15, 'elder':85} staff_df = pd.D
#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列(mike、matt、dave、kanad)x2(day、night)=8列数据。所以在我的玩具中,我传递了一个8位数的列表作为数据,所以没有问题
但在我的现实生活示例中,“mike matt dave kand”级别的值在白天和夜间级别都是相同的。所以我只需要传递4个数据点,而不是8个。我需要以某种方式正确复制这些数据
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列传递,传递的数据有27列
我需要将
[resid_df.iloc[0]。to_numpy()]
从[a,b,c,…z]
复制到[a,a,a,a,b,b,b,b,b,b,b,b,….z,z,z]
我想?不确定是否理解,但对我来说,使用的是相同的解决方案:
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
编辑:
应使用:
是的,很抱歉我的玩具示例没有复制这个问题。我已对问题进行了编辑,并对问题进行了更清晰的解释。@user3556757-您可以选中编辑吗?因为如果你能很好地理解,你需要第二级重新编制索引,以便重复。是的,你能很好地理解我<代码>重新索引是关键。不知何故,我完全不知道这个功能。我现在需要研究它——似乎非常重要。我想我有很多旧代码可以用它来清理。感谢您的代码风格非常清晰。
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