我有两个看起来像这样的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)
答案 0 :(得分:1)
IIUIC,使用rename
和两列df1
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