Python 使用多索引应用

Python 使用多索引应用,python,pandas,dataframe,numpy,Python,Pandas,Dataframe,Numpy,我有一个大数据框作为输入,如下所示: index type price1 price2 3000 C 300 600 3000 P 500 500 3500 C 300 400 3500 P 400 200 4500 P 100 350 我想做一些计算,得到基于微分的fw1的最小值和fw2的最大值。 现在我执行以下操作,但需要几秒钟: #创建数据帧 数据={'type':['C','P','C','P','C','C'],

我有一个大数据框作为输入,如下所示:

index type price1 price2
3000   C    300   600
3000   P    500   500
3500   C    300   400
3500   P    400   200
4500   P    100   350
我想做一些计算,得到基于微分的fw1的最小值和fw2的最大值。 现在我执行以下操作,但需要几秒钟:

#创建数据帧
数据={'type':['C','P','C','P','C','C'],
“价格1”:[6,4,3,2,5,6],
‘价格2’:[1,2,3,4,5,6.]}
df=pd.DataFrame(数据,索引=[3000.]。,
3000.,
3500.,
3500.,
4000.,
5000.])
k_c=np.unique(df.index[(df['type']='c'))
k_p=np.unique(df.index[(df['type']='p'))
公共k=np.intersect1d(k_c,k_p)
fw1=np.array([k+df['price1'].values[(df['type']='C')和(df.index==k)]/2
-df['price2'].值[(df['type']='P')&(df.index==k)]/2
对于公共的k(k])
fw2=np.array([k+df['price2'].values[(df['type']='C')和(df.index==k)]/2
-df['price1'].值[(df['type']='P')&(df.index==k)]/2
对于公共的k(k])
max_fw=max(fw1)
min_fw=min(fw2)
我试着使用一个透视图。应用,但不可能使它与多索引一起工作。结果pivot看起来不错,但我找不到一种方法来使用.apply计算max(fw1)min(fw2)

fwd\u fast=(
df.reset_index()
.pivot(index='index',columns='type',value=['price1','price2'])
.dropna()
)
#不起作用
快速应用(
lambda行:pd.系列([row.index+row[('C','price1')]/2-row[('P','price2')]/2],index=['fw1']),
轴=1,结果(类型=展开)
试试:

解释:

在您的代码中有两个关键错误,即:

您正在使用
('C','price1')
('P','price2')
而不是
('price1','C')
('price2','P')

您通过
row.index
而不是
row.name
错误地访问索引值

注意:您还可以通过简单地执行以下操作来降低
apply()
方法的成本:

out=(fwd_fast.index+fwd_fast[('price1','C')]/2-fwd_fast[('price2','P')] / 2).to_frame('fw1')
输出的输出

        fw1
index   
3000.0  3002.0
3500.0  3499.5
        fw1
index   
3000.0  3002.0
3500.0  3499.5