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

如何为pandas DataFrame编写支持跨行属性比对的if-then lambda语句

实现方案

核心逻辑:你原有逐行比对多行的写法存在局限,apply调用时无法直接获取同分组其他行数据,更合理的实现是先按你指定的ID、Type、Group、Name四个字段分组,统计分组内Executor的唯一值数量,再按优先级匹配规则即可。

完整可运行代码

import pandas as pd

# 原始数据
data = [[11001218, 'Value', 93483.37, 'G', '', 93483.37, '', '56117J100', 'FRA', 'Equity'], 
        [11001218, 'Value', 3572.73, 'G', 3572.73, '', '56117J100', '', 'LUM', 'Equity'], 
        [11001218, 'Value', 89910.64, 'G', 89910.64, '', '56117J100', '', 'WAR', 'Equity'],
        [11005597, 'Value', 72640313.34,'L','',72640313.34, 'REVR21964', '','IN2',  'Repo']
       ]
df = pd.DataFrame(data, columns = ['ID', 'Type', 'Diff', 'Group', 'Amount','Amount2', 'Id2', 'Id3', 'Executor', 'Name'])

# 初始化结果列
df['Results'] = pd.NA

# 优先级1:先匹配Repo规则
df.loc[(df['Name'] == 'Repo') & (df['Group'] == 'L'), 'Results'] = 'Fine resultant'

# 统计同分组内Executor唯一值数量,transform会把结果广播到组内所有行
df['exec_unique_cnt'] = df.groupby(['ID', 'Type', 'Group', 'Name'])['Executor'].transform('nunique')

# 优先级2:匹配Executor差异规则,不覆盖已经匹配Repo规则的行
df.loc[(df['exec_unique_cnt'] > 1) & (df['Results'].isna()), 'Results'] = 'Difference in Executor'

# 删除临时统计列
df = df.drop('exec_unique_cnt', axis=1)

# 可选:剩余未匹配的行填充默认值
# df['Results'] = df['Results'].fillna('无匹配规则')

print(df)

逻辑说明

  • 原有Repo规则优先级更高,先做匹配赋值,避免被后续规则覆盖
  • groupby+transform的写法不受分组内行数限制,不管同组有2行还是10行存在Executor差异,都可以自动识别,扩展性远高于手动指定比对多行的写法
  • 最终输出的前3行都会标记为Difference in Executor,第4行标记为Fine resultant,完全符合需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:00:01