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

如何基于条件从合并后的Pandas DataFrame生成目标列?

解决方案

步骤1:执行内连接合并

先按names列将两个DataFrame做内连接,自动过滤掉df1中在df2没有匹配的golf记录:

import pandas as pd
import numpy as np

# 定义原始DataFrame
df1 = pd.DataFrame( {
    "names": ['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot', 'golf'],
    "Debit": [0, 5000, 0, 5000, 3000, 0, 700],
    "Credit": [1000, 0, 2000, 0, 0, 8000, 0],
} )

df2 = pd.DataFrame( {
    "names": ['alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot'],
    "db_head": [1, 1, 1, 1, 1, 1],
    "cr_head": [2, 2, 2, 2, 2, 2],
} )

# 内连接合并
merged_df = df1.merge(df2, how="inner", on="names")

步骤2:根据Debit值选择对应head值

用np.where做矢量化判断:当Debit > 0时取db_head,否则取cr_head,新增head列:

merged_df['head'] = np.where(merged_df['Debit'] > 0, merged_df['db_head'], merged_df['cr_head'])

步骤3:清理多余列(可选)

删除不需要的db_head和cr_head列,得到目标格式:

result_df = merged_df.drop(columns=['db_head', 'cr_head'])
print(result_df)

执行后输出:

names  Debit  Credit  head
0    alpha      0    1000     2
1    bravo   5000       0     1
2  charlie      0    2000     2
3    delta   5000       0     1
4     echo   3000       0     1
5  foxtrot      0    8000     2

你之前代码报错的原因

  1. 遍历[df1['names'], df1['Debit']]时,是把整个Series作为单个元素遍历,而非逐行配对,正确写法应该是zip(df1['names'], df1['Debit'])
  2. df1.Debit.item()会尝试取出整个Series的单个值,仅当Series长度为1时有效,不符合你的多场景需求

另外,这种逐行循环的方式效率远低于pandas的矢量化操作,更推荐前面的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:23:11