Python 列的条件减法

Python 列的条件减法,python,pandas,conditional-statements,Python,Pandas,Conditional Statements,我有一个包含股票收益的数据框,我想创建一个新列,其中包含该股票收益与其所属部门ETF收益之间的差异: dict0 = {'date': ['1/1/2020', '1/1/2020', '1/1/2020', '1/1/2020', '1/1/2020', '1/2/2020', '1/2/2020', '1/2/2020', '1/2/2020', '1/2/2020', '1/3/2020', '1/3/2020', '1/3/2020', '1/3/20

我有一个包含股票收益的数据框,我想创建一个新列,其中包含该股票收益与其所属部门ETF收益之间的差异:

dict0 = {'date': ['1/1/2020', '1/1/2020', '1/1/2020', '1/1/2020', '1/1/2020', '1/2/2020', '1/2/2020', '1/2/2020', '1/2/2020',
                  '1/2/2020', '1/3/2020', '1/3/2020', '1/3/2020', '1/3/2020', '1/3/2020'],
         'ticker': ['SPY', 'AAPL', 'AMZN', 'XLK', 'XLY', 'SPY', 'AAPL', 'AMZN', 'XLK', 'XLY', 'SPY', 'AAPL', 'AMZN', 'XLK', 'XLY'],
         'returns': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5],
        'sector': [np.NaN, 'Tech', 'Cons Disc', np.NaN, np.NaN, np.NaN, 'Tech', 'Cons Disc', np.NaN, np.NaN, np.NaN, 'Tech', 'Cons Disc', np.NaN, np.NaN,]}
df = pd.DataFrame(dict0)
df = df.set_index(['date', 'ticker'])
例如,对于2020年1月1日的AAPL,回报率为2。由于它属于科技行业,因此相关回报将是ETF XLK(我有一本字典,可以将行业映射到ETF股票)。在新列中,回报率将是AAPL的回报率2减去XLK当天的回报率4

我在下面的帖子中问了一个类似的问题,我想简单地计算reach股票收益率与1个股票代码的差值,即SPY

这里提出的解决方案是:

def func(row):
    date, asset = row.name
    return df.loc[(date, asset), 'returns'] - df.loc[(date, 'SPY'), 'returns']



dict0 = {'date': ['1/1/2020', '1/1/2020', '1/1/2020', '1/2/2020', '1/2/2020',
                  '1/2/2020', '1/3/2020', '1/3/2020', '1/3/2020'],
         'ticker': ['SPY', 'AAPL', 'MSFT', 'SPY', 'AAPL', 'MSFT', 'SPY', 'AAPL', 'MSFT'],
         'returns': [1, 2, 3, 4, 5, 6, 7, 8, 9]}
df = pd.DataFrame(dict0)  ###
df = df.set_index(['date', 'ticker'])
df['excess_returns'] = df.apply(func, axis=1)
但我还不能修改它,这样我就可以做这个基于部门的。我很感谢你的建议。

你几乎做到了:

def func(行):
日期,资产=行。名称
索引=扇区到索引的映射[行.扇区]
返回df.loc[(日期,资产),“返回”]-df.loc[(日期,索引),“返回”]

由于“MSFT”不存在于初始数据帧中,您从何处获得解决方案中的“MSFT”?请共享示例输出和您所指的词典。很抱歉,我已将示例中的MSFT切换为AMZN,因此我可以有两个不同的扇区。我将添加一个示例输出。哇,非常优雅。我希望我能想到这一点!!!非常感谢你,鲁福尔福维奇。你知道我花了多长时间才弄明白。