如何基于多个列上多个条件的组合为数据框中的新列分配值

时间:2020-03-18 01:39:16

标签: pandas dataframe filtering python-3.6

我的数据框如下

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)

我要基于以下条件添加新列-data ['unique_text_count']:

  1. 如果data ['flag1'] =='y'或data ['flag2'] =='y'或data ['flag3'] =='y'->任何标记应为'y'< / li>
  2. 鉴于以上条件之一为True,如果数据帧中的任何行的标志值均为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行的最终结果将是:

data ['unique_text_count'] = [2,1,3,1,1]

我已经尝试使用iterrows()并在每一行上进行迭代并应用条件并计算计数,但这非常耗时。因此,我希望找到一种更好的方法,而不必分别遍历每一行

1 个答案:

答案 0 :(得分:2)

尝试:

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选择与like参数匹配的列,然后将where与从=='y'创建的布尔矩阵一起使用,以返回带有' n'。最后,将nuniqueaxis=1一起使用来计算一行中的唯一值。