一个数据框( 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'])
答案 0 :(得分:1)
将B
重新定义为“仅MultiIndex”数据帧,然后使用A
和B
用index
屏蔽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
希望这会有所帮助。