如何根据多列的多个条件组合为数据框中的新列赋值
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']:
- 如果数据['flag1'] == 'y' 或数据['flag2'] == 'y' 或数据['flag3'] == 'y' --> 任何标志都应该是 'y'
- 给定上述条件之一为真,如果数据框中的任何行具有任何标志值 'y' 则相应的值 data['text1'],data['text2'] & data['text3'] 应该检查唯一值
新列的值 - 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。最后,使用 nunique
和 axis=1
来计算一行中的唯一值。
我的数据框如下
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']:
- 如果数据['flag1'] == 'y' 或数据['flag2'] == 'y' 或数据['flag3'] == 'y' --> 任何标志都应该是 'y'
- 给定上述条件之一为真,如果数据框中的任何行具有任何标志值 'y' 则相应的值 data['text1'],data['text2'] & data['text3'] 应该检查唯一值
新列的值 - 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。最后,使用 nunique
和 axis=1
来计算一行中的唯一值。