我正在尝试在Python中复制Excel类型的“索引/匹配”。 我有两个 dfs。
df1:
RIC | 扇区代码 | SP500 | SP400 | SP600 |
---|---|---|---|---|
FI | 40 | SP500 | ||
BRBR | 30 | SP400 | ||
XPEL | 25 | SP600 |
df2:(包含查找表)
代码 | 姓名 | SP400 | SP500 | SP600 |
---|---|---|---|---|
25 | 非必需消费品 | .SPMDCD | .SPSMCD | .SPLRCD |
30 | 消费必需品 | .SPMDCS | .SPSMCS | .SPLRCS |
10 | 能源 | .SPMDCE | .SPSMCE | .SPNY |
40 | 财务 | .SPMDCF | .SPSMCF | .SPSY |
35 | 医疗保健 | .SPMDCA | .SPSMCA | .SPXHC |
20 | 工业 | .SPMDCI | .SPSMCI | .SPLRCI |
45 | 信息技术 | .SPMDCT | .SPSMCT | .SPLRCT |
15 | 材料 | .SPMDCM | .SPSMCM | .SPLRCM |
50 | 电信服务 | .SPMDCL | .SPSMCL | .SPLRCL |
55 | 公用事业 | .SPMDCU | .SPSMCU | .SPLRCU |
期望的结果:(将结果添加到 df1)
RIC | 扇区代码 | SP500 | SP400 | SP600 | 结果 SP500 | 结果 SP400 | 结果 SP600 |
---|---|---|---|---|---|---|---|
FI | 40 | SP500 | .SPSMCF | ||||
BRBR | 30 | SP400 | .SPMDCS | ||||
XPEL | 25 | SP600 | .SPLRCD |
我试过了
merged_df = df1.merge(df2, left_on=['Sector Code'], right_on=['Code'], how='left').
这结合了 df1 和 df2,但它给了我每场比赛(SP500、SP400 和 SP600),而不仅仅是每个比赛的一场比赛。
您可以使用
.mask
从合并结果中删除值。列 SP500, SP400, SP600
的填充值可用作列 SP400_Result, SP500_Result, SP600_Result
的掩码。
import pandas as pd
df1 = pd.DataFrame([
{'RIC': 'FI', 'Sector Code': 40, 'SP500': 'SP500', 'SP400': '', 'SP600': ''},
{'RIC': 'BRBR', 'Sector Code': 30, 'SP500': '', 'SP400': 'SP400', 'SP600': ''},
{'RIC': 'XPEL', 'Sector Code': 25, 'SP500': '', 'SP400': '', 'SP600': 'SP600'}])
df2 = pd.DataFrame({
'Code': [25, 30, 10, 40, 35, 20, 45, 15, 50, 55],
'Name': ['Consumer Discretionary', 'Consumer Staples', 'Energy', 'Financials',
'Health Care', 'Industrials', 'Information Technology', 'Materials',
'Telecommunication Services', 'Utilities'],
'SP400': ['.SPMDCD', '.SPMDCS', '.SPMDCE', '.SPMDCF', '.SPMDCA', '.SPMDCI',
'.SPMDCT', '.SPMDCM', '.SPMDCL', '.SPMDCU'],
'SP500': ['.SPSMCD', '.SPSMCS', '.SPSMCE', '.SPSMCF', '.SPSMCA', '.SPSMCI',
'.SPSMCT', '.SPSMCM', '.SPSMCL', '.SPSMCU'],
'SP600': ['.SPLRCD', '.SPLRCS', '.SPNY', '.SPSY', '.SPXHC', '.SPLRCI',
'.SPLRCT', '.SPLRCM', '.SPLRCL', '.SPLRCU']})
merged_df = df1.merge(df2, left_on=['Sector Code'],
right_on=['Code'], how='left', suffixes=['', '_Result']
).drop(columns=['Code', 'Name'])
cols_left = [ 'SP500', 'SP400', 'SP600']
cols_right = ['SP400_Result', 'SP500_Result', 'SP600_Result']
merged_df.loc[:, cols_right] = merged_df.loc[:, cols_right].mask(
merged_df.loc[:, cols_left].eq('').values, '')