在Pandas DataFrame列间应用OR条件的实现方法
解决DataFrame生成布尔列:匹配指定列取值集合的问题
首先得指出你代码里的一个小细节问题:你的truth_list里bank_df['Overdraft'].isin(['Yes'])和原数据不匹配——原数据的Overdraft列取值是'Y'/'N',不是'Yes',这个得先修正,不然这个条件永远返回False哦。
接下来,你提到想用apply()+any(),其实完全不需要这么麻烦,Pandas的向量化操作就能高效解决这个问题,而且比逐行apply快得多,尤其是处理大数据量的时候。
方法一:向量化布尔运算(推荐)
先创建示例DataFrame:
import pandas as pd bank_dict = {'Name' : ['A', 'B', 'C', 'D', 'E'], 'Type' : ['Retail', 'Corporate', 'Corporate', 'Wholesale', 'Retail'], 'Overdraft': ['Y', 'Y', 'Y', 'N', 'N'], 'Forex': ['USD', 'GBP', 'EUR', 'JPY', 'GBP']} bank_df = pd.DataFrame(bank_dict)
然后修正并定义你的条件列表,再用逻辑运算符组合:
from functools import reduce # 修正Overdraft的取值,同时定义三个条件 truth_conditions = [ bank_df['Type'].isin(['Retail']), bank_df['Overdraft'].isin(['Y']), # 改为和数据匹配的'Y' bank_df['Forex'].isin(['USD', 'GBP']) ] # 如果你想要"满足任意一个条件就为True"(对应any()的效果),用逻辑或|组合 bank_df['TruthCol'] = reduce(lambda x, y: x | y, truth_conditions) # 如果你想要"满足所有条件才为True"(对应all()的效果),用逻辑与&组合 # bank_df['TruthCol'] = reduce(lambda x, y: x & y, truth_conditions)
运行后得到的结果(以"任意条件满足"为例):
| Name | Type | Overdraft | Forex | TruthCol |
|---|---|---|---|---|
| A | Retail | Y | USD | True |
| B | Corporate | Y | GBP | True |
| C | Corporate | Y | EUR | True |
| D | Wholesale | N | JPY | False |
| E | Retail | N | GBP | True |
方法二:用apply()实现(不推荐,效率低)
如果你坚持想用apply+any的思路,也可以这么写,本质是逐行判断:
def check_row_conditions(row): # 定义每行的三个判断条件 conditions = [ row['Type'] in ['Retail'], row['Overdraft'] in ['Y'], row['Forex'] in ['USD', 'GBP'] ] # any()表示任意一个条件满足就返回True,换成all()就是所有条件满足才返回True return any(conditions) bank_df['TruthCol'] = bank_df.apply(check_row_conditions, axis=1)
为什么不推荐这个方法?因为apply(axis=1)是逐行遍历处理,当你的DataFrame有几万甚至几十万行的时候,速度会比向量化操作慢很多,所以优先用第一种方法。
内容的提问来源于stack exchange,提问作者shanlodh
相关产品推荐
相关产品推荐

