当两个df有不同的索引时赋值

2024-10-11 16:30:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个类似这样的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']]

预期的输出将包括分配给一个ticker的数值,程序将把该ticker识别为“XLI,XLV,XLK”的一部分,这样我就可以在df2中搜索MMM的值,并且程序将向我显示多余的移动#及其在(XLI)中的族


Tags: companypdweightsectorindustrymmmsubabt
2条回答

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

IIUIC,使用rename和来自df1的两列的dict

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

相关问题 更多 >

    热门问题