[英]Applying a function for a multi-index dataframe
我有一个按日期和股票编制索引的多索引数据框。 这是一个例子:
Column1
Date Ticker
2008-08-01 AAPL value1
MSFT value2
IBM value3
etc.
2008-08-02 AAPL value4
MSFT value5
IBM value6
etc.
我想做的是在每个日期对该列应用一个函数,然后替换该列。 例如,说从2008-08-01开始的每个日期,我要对Column1求平均值,并取每个报价器值与该平均值之间的差。 然后,Column1将被这些值替换。 我最终会遇到:
Column1
Date Ticker
2008-08-01 AAPL avg(Column1, 8/1/08) - value1
MSFT avg(Column1, 8/1/08) - value2
IBM avg(Column1, 8/1/08) - value3
etc.
2008-08-02 AAPL avg(Column1, 8/2/08) - value4
MSFT avg(Column1, 8/2/08) - value5
IBM avg(Column1, 8/2/08) - value6
etc.
我可以这样做:
df = df.copy()
col1_adjusted = [func(df.loc[df.index.get_level_values('Date') == date]['Column1']) for date in dates]
col1_adjusted = [item for sublist in col1_adjusted for item in sublist]
df.Column1= col1_adjusted
但这要花很长时间,因为我有很多约会。 有一个更好的方法吗?
Debasish对拆分应用合并方法是正确的。 举个简单的例子:
# Use groupby to find the average by date; sub in w/e func for mean
df['Column2'] = df.groupby(level='Date').transform('mean')
# Replace Column1 with the desired value
df['Column1'] = df['Column2'] - df['Column1']
上面的示例是为了清楚起见,但这是更好的单行代码:
df['Column1'] = df.groupby(level='Date')['Column1'].transform('mean').sub(df['Column1'])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.