如何基于MLB列的部分匹配合并两个Pandas DataFrame?
解决方案
先还原示例中的两个DataFrame:
import pandas as pd df_1 = pd.DataFrame({ 'Cities': ['New York City', 'Los Angeles', 'San Francisco'], 'Population': [20153634, 13310447, 6657982], 'MLB': ['Yankees Mets', 'Dodgers Angels', 'Giants Athletics'] }) df_2 = pd.DataFrame({ 'MLB': ['Red Sox', 'Yankees', 'Rays', 'Blue'], 'W': [108.0, 100.0, 90.0, 73.0], 'L': [54.0, 62.0, 72.0, 89.0] })
实现步骤
- 拆分左表MLB列到多行
把df_1中每个城市的MLB队名拆分成单独行,保留城市和人口信息:
# 拆分MLB列并展开为多行 df_1_expanded = df_1.assign(MLB=df_1['MLB'].str.split()).explode('MLB').reset_index(drop=True)
- 与右表匹配合并
用merge方法匹配拆分后的队名,保留左表所有行(即使右表无对应数据):
merged = df_1_expanded.merge(df_2, on='MLB', how='left')
- 分组拼接W/L信息
按原城市和人口分组,把每个队的W/L数据格式化为字符串,没有匹配到的队可标注无数据:
# 定义拼接函数:格式化W/L为"队名(W-L)",无匹配则显示"队名(无数据)" def format_wl(group): wl_strs = [] for _, row in group.iterrows(): if pd.notna(row['W']) and pd.notna(row['L']): wl_str = f"{row['MLB']}({row['W']}-{row['L']})" else: wl_str = f"{row['MLB']}(无数据)" wl_strs.append(wl_str) return ', '.join(wl_strs) # 分组应用函数并合并原MLB列 final_df = merged.groupby(['Cities', 'Population']).apply(format_wl).reset_index(name='MLB_WL') final_df = final_df.merge(df_1[['Cities', 'MLB']], on='Cities') # 调整列顺序 final_df = final_df[['Cities', 'Population', 'MLB', 'MLB_WL']]
最终结果
运行后得到的final_df如下:
Cities Population MLB MLB_WL 0 New York City 20153634 Yankees Mets Yankees(100.0-62.0), Mets(无数据) 1 Los Angeles 13310447 Dodgers Angels Dodgers(无数据), Angels(无数据) 2 San Francisco 6657982 Giants Athletics Giants(无数据), Athletics(无数据)
如果只想保留匹配到的队信息,可修改format_wl函数,只收集有数据的条目:
def format_wl(group): wl_strs = [] for _, row in group.iterrows(): if pd.notna(row['W']) and pd.notna(row['L']): wl_str = f"{row['MLB']}({row['W']}-{row['L']})" wl_strs.append(wl_str) return ', '.join(wl_strs) if wl_strs else '无匹配数据'
内容的提问来源于stack exchange,提问作者denis pchelkin
相关产品推荐
相关产品推荐

