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

