我的数据框如下
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']:
新列的值-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()并在每一行上进行迭代并应用条件并计算计数,但这非常耗时。因此,我希望找到一种更好的方法,而不必分别遍历每一行
答案 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'。最后,将nunique
与axis=1
一起使用来计算一行中的唯一值。