繁体   English   中英

为多索引数据框应用函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM