如何根据多列的多个条件组合为数据框中的新列赋值

How to assign a value to a new column in a data frame based on a combination of multiple conditions on multiple columns

我的数据框如下

data = {'ID': [1,2,3,4,5],
        'text1':['ab','cd','ef','gh','ij'],
        'text2':['ab','de','fh','hj','ij'],
        'text3':['xy','cd','mn','op','qr'],
        'flag1': ['y', 'n', 'y', 'y', 'n'],
        'flag2': ['y', 'y', 'y', 'n', 'n'],
        'flag3': ['y', 'n', 'y', 'n', 'y']}

frame = pd.DataFrame(data)

我想根据以下条件添加一个新列 - 数据['unique_text_count']:

  1. 如果数据['flag1'] == 'y' 或数据['flag2'] == 'y' 或数据['flag3'] == 'y' --> 任何标志都应该是 'y'
  2. 给定上述条件之一为真,如果数据框中的任何行具有任何标志值 'y' 则相应的值 data['text1'],data['text2'] & data['text3'] 应该检查唯一值
  3. 新列的值 - data['unique_text_count'] 将为:

    0 - 如果该行的所有标志值都是 'n'

    1 - 如果任一标志值为 'y',并且标志为 'y' 的相应文本列中唯一值的计数为 1

    2 - 如果任一标志值为 'y',并且标志为 'y' 的相应文本列中唯一值的计数为 2

    3 - 如果任一标志值为 1,并且标志为 'y' 的相应文本列中唯一值的计数为 3

5 行的最终结果将是:

数据['unique_text_count'] = [2, 1, 3, 1, 1]

我已经尝试使用 iterrows() 并遍历每一行并应用条件并计算计数,但这非常耗时。所以,我希望有一种更好的方法来做到这一点,而不必单独遍历每一行

尝试:

frame['unique_text_count'] = (frame.filter(like='text')
                                   .where((frame.filter(like='flag') == 'y').to_numpy())
                                   .nunique(axis=1))

输出:

   ID text1 text2 text3 flag1 flag2 flag3  unique_text_count
0   1    ab    ab    xy     y     y     y                  2
1   2    cd    de    cd     n     y     n                  1
2   3    ef    fh    mn     y     y     y                  3
3   4    gh    hj    op     y     n     n                  1
4   5    ij    ij    qr     n     n     y                  1

详情:

使用 filter 到 select 匹配 like 参数的列,然后使用 where 和从 == 'y' 到 return 带有 'n' 的文本和 nan。最后,使用 nuniqueaxis=1 来计算一行中的唯一值。