如何基于条件从合并后的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
你之前代码报错的原因
- 遍历
[df1['names'], df1['Debit']]时,是把整个Series作为单个元素遍历,而非逐行配对,正确写法应该是zip(df1['names'], df1['Debit']) df1.Debit.item()会尝试取出整个Series的单个值,仅当Series长度为1时有效,不符合你的多场景需求
另外,这种逐行循环的方式效率远低于pandas的矢量化操作,更推荐前面的解决方案。
内容的提问来源于stack exchange,提问作者Atif Sheikh
相关产品推荐
相关产品推荐

