在外部条件下将平均值函数应用于MultiIndex数据框

时间:2018-08-17 18:38:43

标签: python pandas dataframe

一个数据框( A )具有3个MultiIndex列。 另一个数据框( B )具有 quote_date 到期 strike 的信息。

此任务的目标是使用数据框 B 过滤数据框 A ,以便计算价格列的平均值。最终数据帧必须与原始数据帧相似,但平均行数除外。

数据框( C )是我们想要的最终结果。 由于必须将此功能应用于大量数据,因此不应使用for循环。

import pandas as pd
from datetime import datetime

A = pd.DataFrame([[datetime(2005,1,1), datetime(2005,1,2),  1240, 1234],\
          [datetime(2005,1,1), datetime(2005,1,2), 1250, 1235], 
          [datetime(2005,1,1), datetime(2005,1,3), 1230, 1235],
          [datetime(2005,1,1), datetime(2005,1,3), 1240, 1235],
          [datetime(2005,1,1), datetime(2005,1,4), 1240, 1235],
          [datetime(2005,1,1), datetime(2005,1,5), 1240, 1235],
          [datetime(2005,1,1), datetime(2005,1,5), 1240, 1233],
          [datetime(2005,1,1), datetime(2005,1,6), 1240, 1235]], \
         columns=['quote_date', 'expiration', 'strike', 'price']).set_index(['quote_date', 'expiration', 'strike'])

B = pd.DataFrame([[datetime(2005,1,1),datetime(2005,1,5),1240]], columns=['quote_date', 'expiration', 'strike'])

C = pd.DataFrame([[datetime(2005,1,1), datetime(2005,1,2),  1240, 1234],\
          [datetime(2005,1,1), datetime(2005,1,2), 1250, 1235], 
          [datetime(2005,1,1), datetime(2005,1,3), 1230, 1235],
          [datetime(2005,1,1), datetime(2005,1,3), 1240, 1235],
          [datetime(2005,1,1), datetime(2005,1,4), 1240, 1235],
          [datetime(2005,1,1), datetime(2005,1,5), 1240, 1234],
          [datetime(2005,1,1), datetime(2005,1,6), 1240, 1235]], \
         columns=['quote_date', 'expiration', 'strike', 'price']).set_index(['quote_date', 'expiration', 'strike'])

1 个答案:

答案 0 :(得分:1)

B重新定义为“仅MultiIndex”数据帧,然后使用ABindex屏蔽groupby。最后,结合有和没有groupby的数据帧。

# create "index only" dataframe
B = B.set_index(['quote_date', 'expiration', 'strike'])

# groupby only if the index of A exists in B
C = A.loc[A.index.isin(B.index)].groupby(level=[0,1,2]).mean()

# combine dataframes with/without groupby (and sort it if needed)
C = A.loc[~A.index.isin(B.index)].append(C).sort_index(level=[0,1,2])

>>> C
                               price
quote_date expiration strike       
2005-01-01 2005-01-02 1240     1234
                      1250     1235
           2005-01-03 1230     1235
                      1240     1235
           2005-01-04 1240     1235
           2005-01-05 1240     1234
           2005-01-06 1240     1235

希望这会有所帮助。