Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用多索引列填充数据帧_Python_Pandas - Fatal编程技术网

Python 使用多索引列填充数据帧

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

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

我的新情况是dataframe有一个多索引列,而不是一个简单的1级列。因此,我不清楚如何强制pandas在使用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列(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