Python Pandas计算Result列:其余MCond全为真且27、31列至少一个为真
你可以将原有计算Result列的代码替换为拆分两个判断逻辑的写法即可满足需求:
逻辑拆解
- 首先筛选出除
Mcond 27、Mcond 31之外的所有Mcond开头的列,判断这些列是否全部为True - 再判断
Mcond 27和Mcond 31是否至少有一个为True - 两个条件同时满足时,
Result为True,否则为False
修改后的代码
def function1(df, tf): df.loc[:, ('Mcond 1')] = df.A > df.A.shift(1) df.loc[:, ('Mcond 2')] = df.B < df.B.shift(1) df.loc[:, ('Mcond 3')] = df.C > df.D df.loc[:, ('Mcond 4')] = df.E > df.E.shift(1) df.loc[:, ('Mcond 5')] = df.F > df.F.shift(1) if tf == 'A1': df.loc[:, ('Mcond 27')] = df.consec5 == 1 elif tf == 'B1': df.loc[:, ('Mcond 27')] = df.consec3 == 1 elif tf == 'C1': df.loc[:, ('Mcond 27')] = True else: df.loc[:, ('Mcond 27')] = True df.loc[:, ('Mcond 31')] = df.consec2.rolling(3).sum() >= 1 # 以下为修改后的Result计算逻辑 # 筛选除27、31之外的所有Mcond列 other_mcond_cols = df.columns[df.columns.str.startswith('Mcond') & ~df.columns.isin(['Mcond 27', 'Mcond 31'])] # 条件1:其余Mcond列全部为真 all_other_true = df[other_mcond_cols].all(axis=1) # 条件2:27和31至少一个为真 either_27_31_true = df['Mcond 27'] | df['Mcond 31'] # 两个条件同时满足才为真 df.loc[:, ('Result')] = all_other_true & either_27_31_true return df
注意:如果你的实际列名中
Mcond和数字之间没有空格,请同步调整isin判断中的列名字符串即可。
内容的提问来源于stack exchange,提问作者Garrad2810
相关产品推荐
相关产品推荐

