如何在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
相关产品推荐
相关产品推荐

