You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中实现多DataFrame条件关联、列选择与重命名

Pandas实现带条件关联的DataFrame合并(对应PySpark逻辑)

我有两个DataFrame(D1和D2),已经在PySpark中实现了带条件的关联逻辑:当D1指定列的值大于15时用16替代,否则用原列值与D2的department列做内关联;同时选择两表指定列并将D2的列重命名,且用单行代码完成。但我自己写的Pandas代码无法正常运行,求正确的Pandas实现方式。

PySpark实现示例

# 第一次关联并选择列
D1 = D1.join(D2, (when(D1.Company > 15, 16).otherwise(D1.Company)) == D2.department, 'inner').select(D1.ID, D1.Name, D1.Company, D1.Company1, D1.Company2, round(D2.Branch, 2).alias("NewBranch"))

# 第二次关联并新增列
D1 = D1.join(D2, (when(D1.FlexTwo > 15, 16).otherwise(D1.company1)) == D2.department, 'inner').select(D1.ID, D1.Name, D1.Company, D1.Company1, D1.Company2,D1.NewBranch, round(D2.Branch1, 2).alias("NewBranch1"))

我尝试的Pandas代码(无法正常工作)

# 第一次合并
D1 = pd.merge(D1, D2, how='inner', left_on = np.where((D1['company']) > 15, 16, D1['company']), right_on = 'department').loc[:, ["company"  ,"ID","Name","Company1","Company2","Branch"]]

# 重命名并保留两位小数
D1=round(D1.rename(columns = {'Branch':'NewBranch'}),2)

# 第二次合并
D1 = pd.merge(D1, D2, how='inner', left_on = np.where((D1['company1']) > 15, 16, D1['company1']), right_on = 'department').loc[:, ["company"  ,"ID","Name","Company1","Company2","NewBranch"]]

正确的Pandas实现方式

你的Pandas代码核心问题在于:round作用范围错误(直接对整个DataFrame取整会影响无需保留小数的列)、第二次合并时遗漏新增列处理,且逻辑可以更贴近PySpark的单行链式风格。

对应第一次关联的单行实现

D1 = (pd.merge(D1, D2, how='inner',
               left_on=np.where(D1['Company'] > 15, 16, D1['Company']),
               right_on='department')
      .loc[:, ['ID', 'Name', 'Company', 'Company1', 'Company2', 'Branch']]
      .rename(columns={'Branch': 'NewBranch'})
      .assign(NewBranch=lambda x: x['NewBranch'].round(2)))

对应第二次关联的单行实现

D1 = (pd.merge(D1, D2, how='inner',
               left_on=np.where(D1['FlexTwo'] > 15, 16, D1['Company1']),
               right_on='department')
      .loc[:, ['ID', 'Name', 'Company', 'Company1', 'Company2', 'NewBranch', 'Branch1']]
      .rename(columns={'Branch1': 'NewBranch1'})
      .assign(NewBranch1=lambda x: x['NewBranch1'].round(2)))

关键说明

  • 用assign单独对需要保留小数的列做round(2),避免影响其他列
  • 用括号包裹实现链式调用,和PySpark的单行操作逻辑对齐
  • 确保loc选择的列与PySpark的select完全匹配,避免遗漏或多选
  • 注意列名大小写一致性(比如PySpark中的Company和Pandas代码里的company要统一)

内容的提问来源于stack exchange,提问作者SanjanaSanju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:27:30