首页 > 解决方案 > 如何确定 N 个布尔 Pandas 列的逻辑真值?

问题描述

我有一个管道,它对表执行分析并添加额外的功能来对该行数据进行分类。在这个玩具案例中,我有一张带有功能的桌子,[id, x, y, z]我正在添加has_adj. 我不知道如何确定 N 列的逻辑真值(即调整搜寻中的列数可能是 N):

    id   x     y     z     n   has_adj_0  has_adj_1  has_adj_n
0   AX1  10.0  Adj   <NA>  ..  True       False      ...
1   V0D  3.5   <NA>  <NA>  ..  False      False      ...
2   G7L  8.0   <NA>  Adj   ..  False      True       ...

最后,我设置了df['has_adj'] = True 行包含任何 True值的特征,否则False

这是生成上表的玩具示例:

import pandas as pd
import re

def hf_txn_has_adj(text, regex_dict):
    if pd.isna(text):
        return False

    rx = re.compile(regex_dict['regex_value'])
    result = rx.match(text)
    if rx.match(text):
        return True
    else:
        return False

regex_dict = {'regex_value': '(Adj)'}
df = pd.DataFrame([['AX1', 10, 'Adj', pd.NA], 
                   ['V0D', 3.5, pd.NA, pd.NA], 
                   ['G7L', 8, pd.NA, 'Adj']], 
                  columns=['id', 'x', 'y', 'z'])

for i, adj_feat in enumerate(['y', 'z']):
    df['has_adj_' + str(i)] = df[adj_feat].apply(hf_txn_has_adj, regex_dict=regex_dict)

标签: pythonpandas

解决方案


尝试filter+any轴 = 1:

df['has_adj'] = df.filter(like='has_adj_').any(axis=1)

print(df)

df

    id     x     y     z  has_adj_0  has_adj_1  has_adj
0  AX1  10.0   Adj  <NA>       True      False     True
1  V0D   3.5  <NA>  <NA>      False      False    False
2  G7L   8.0  <NA>   Adj      False       True     True

推荐阅读