Python:使用索引/匹配的 excel 等效项合并某些列上的两个数据帧

问题描述 投票:0回答:1

我正在尝试在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),而不仅仅是每个比赛的一场比赛。

python pandas dataframe merge
1个回答
0
投票

您可以使用

.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, '')
© www.soinside.com 2019 - 2024. All rights reserved.