从一个多索引数据框中选择值以添加到另一个现有的多索引数据框中的新列

时间:2020-01-22 13:25:01

标签: python pandas dataframe mapping multi-index

好吧,我可以在这方面使用一些帮助。我创建了一个函数,可以将两个多索引数据帧以及一组kwarg馈入该函数,然后该函数将从一个数据帧中获取值并将它们添加到另一个数据列中。

只是为了确保我对它的解释足够好,这两个数据框都是股票信息,其中一个数据框是我的“宇宙”或我正在分析的股票,另一个是市场数据框。和行业ETF。

所以我的函数要做的是采用以下形式的kwargs:

new_stock_column_name = "existing_sector_column_name"

这是我的实际功能:

def map_columns(hist_multi_to, hist_multi_from, **kwargs):
    ''' Map columns from the sector multi index dataframe to a new column
        in the existing universe multi index dataframe.

        **kwargs should be in the format newcolumn="existing_sector_column"
    '''
    df_to = hist_multi_to.copy()
    df_from = hist_multi_from.copy()

    for key, value in kwargs.items(): 
        df_to[key] = np.nan

        for index, val in df_to.iterrows():
            try:
                df_to.loc[index, key] = df_from.loc[(index[0],val.xl_sect),value]
            except KeyError:
                pass

    return df_to

我相信我的函数可以完全按照我的预期工作,只是要花很长时间才能遍历数据。必须有一个更好的方法来执行此操作,因此,您能提供的任何帮助将不胜感激。

我事先表示歉意,但是我在提出两个简单的示例数据框时遇到了麻烦,但是唯一真正的要求是股票数据框中有一列列出其行业ETF,并且该列值直接与ETF数据框的1级索引。

仅在某些情况下,并非所有分析日期都存在ETF,就可以使用异常处理程序,在这种情况下,我不介意将值保留为NaN。

更新: 这是修改后的代码段,使您可以运行该函数以查看我在说什么。原谅我,我的编码能力有限。

import pandas as pd
import numpy as np

stock_arrays = [np.array(['1/1/2020','1/1/2020','1/2/2020','1/2/2020']),
                np.array(['aapl', 'amzn', 'aapl', 'amzn'])]
stock_tuples = list(zip(*stock_arrays))
stock_index = pd.MultiIndex.from_tuples(stock_tuples, names=['date', 'stock'])

etf_arrays = [np.array(['1/1/2020','1/1/2020','1/2/2020','1/2/2020']),
                np.array(['xly', 'xlk','xly', 'xlk'])]
etf_tuples = list(zip(*etf_arrays))
etf_index = pd.MultiIndex.from_tuples(etf_tuples, names=['date', 'stock'])

stock_df = pd.DataFrame(np.random.randn(4), index=stock_index, columns=['close_price'])
etf_df = pd.DataFrame(np.random.randn(4), index=etf_index, columns=['close_price'])

stock_df['xl_sect'] = np.array(['xlk', 'xly','xlk', 'xly'])

def map_columns(hist_multi_to, hist_multi_from, **kwargs):
    ''' Map columns from the sector multi index dataframe to a new column
        in the existing universe multi index dataframe.

        **kwargs should be in the format newcolumn="existing_sector_column"
    '''
    df_to = hist_multi_to.copy()
    df_from = hist_multi_from.copy()

    for key, value in kwargs.items(): 
        df_to[key] = np.nan

        for index, val in df_to.iterrows():
            try:
                df_to.loc[index, key] = df_from.loc[(index[0],val.xl_sect),value]
            except KeyError:
                pass

    return df_to

现在,在单元格中运行上述命令后,您可以通过如下方式调用该函数:

new_stock_df = map_columns(stock_df, etf_df, sect_etf_close='close_price')
new_stock_df

我希望这会有所帮助。如您所见,该函数有效,但是对于非常大的数据集,它极其缓慢且效率低下。

0 个答案:

没有答案