当两个dfs具有不同的索引时分配值

时间:2017-07-13 16:15:45

标签: python pandas dataframe

我有两个看起来像这样的dfs:

Symbol Sector      Sub-industry    Company     Weight      SectorSymbol
Ticker           
MMM    Industrials  Conglomerates   MCompany    0.602676   XLI
ABT    Health Care  Equipment       Abbott Lab  0.401900   XLV
ABBV   Health Care  Pharmaceuticals AbbVie Inc  0.550174   XLV
ACN    Info Tech    Consulting      Accenture   0.370650   XLK
ATVI   Info Tech    Entertainment   Activision  0.192788   XLK

                MMM     ABT     ABBV    ACN    ATVI
Date
2017-01-03      1.4     2.3     4.5     2.1    .7
2017-01-04      .8      3.1     5.2     1.8    1.2
2017-01-05      2.4     2.1     5.5     1.6    1.4

我正在尝试将我在第一个df中定义的“扇区符号”值应用到第二个df(MMM,ABT,ABBV等)中的代码中,这样我的第二个df就会将符号MMM识别为部分XLI,ABT作为XLV,等等。

df1 = pd.DataFrame(
    {'Sector': ['Industrials'] + ['Health Care']*2 + ['Info Tech']*2,
     'Sub-industry': ['Conglomerates', 'Equipment', 'Pharmaceuticals', 'Consulting', 'Entertainment'],
     'Company': ['MCompany', 'Abbott Lab', 'AbbVie Inc', 'Accenture', 'Activision'],
     'Weight': [.602676, .4019, .550174, .37065, .192788],
     'SectorSymbol': ['XLI', 'XLV', 'XLV', 'XLK', 'XLK']},
    index=pd.Index(['MMM', 'ABT', 'ABBV', 'ACN', 'ATVI'], name='Symbol Ticker')
    )[['Sector', 'Sub-industry', 'Company', 'Weight', 'SectorSymbol']]

df2 = pd.DataFrame({'MMM': [1.4, .8, 2.4], 
                    'ABT': [2.3, 3.1, 2.1], 
                    'ABBV': [4.5, 5.2, 5.5], 
                    'ACN': [2.1, 1.8, 1.6], 
                    'ATVI': [.7, 1.2, 1.4]},
                  index=pd.Index(['2017-01-03', '2017-01-04', '2017-01-05'], name='Date')
                  )[['MMM', 'ABT', 'ABBV', 'ACN', 'ATVI']]

预期输出将包括分配给股票代码的数值,其中程序将识别该股票代码作为“XLI,XLV,XLK”的一部分,所以我可以在df2中搜索MMM的值,以及程序会告诉我多余的运动#和它的家庭(XLI)

2 个答案:

答案 0 :(得分:1)

IIUIC,使用rename和两列df1

中的{d}
In [639]: df2.rename(columns=df1['SectorSymbol'].to_dict())
Out[639]:
            XLI  XLV  XLV  XLK  XLK
Date
2017-01-03  1.4  2.3  4.5  2.1  0.7
2017-01-04  0.8  3.1  5.2  1.8  1.2
2017-01-05  2.4  2.1  5.5  1.6  1.4

并且,按平均值

合并列
In [641]: dff = df2.rename(columns=df1['SectorSymbol'].to_dict())

In [642]: dff.groupby(dff.columns, axis=1).mean()
Out[642]:
            XLI  XLK   XLV
Date
2017-01-03  1.4  1.4  3.40
2017-01-04  0.8  1.5  4.15
2017-01-05  2.4  1.5  3.80

答案 1 :(得分:1)

1)创建一个将符号映射到扇区符号的字典。

2)使用列表推导来获得相关符号的所有扇区符号的有序映射。在字典上使用get以允许未映射的证券(请参阅下面的评论)。

3)对扇区符号使用groupby并取平均值。

d = df1['SectorSymbol'].to_dict()
sector_symbols = [d.get(symbol) for symbol in df2]
>>> df2.groupby(sector_symbols, axis=1).mean()
            XLI  XLK   XLV
Date                      
2017-01-03  1.4  1.4  3.40
2017-01-04  0.8  1.5  4.15
2017-01-05  2.4  1.5  3.80