python 中用于标记的多个 and or 条件
Multiple and or conditions for flagging in python
我在 pd 数据框中有以下数据:
Sliver 和 OThers(像所有 Multi 一样 - Multi_A 等)的截止值如下:
d_id Sliver Multi_A Multi_B Multi_C Multi_D no_of_prem Flag_Sliver
5 4.80 53.05 19.07 13.59 0 3 No
18 5.17 27.63 26.83 12.15 0 3 No
25 1.28 0.14 0.12 0 0 2 Yes
32 0.90 0.43 0.94 0 0 2 No
33 3.69 3.24 0.77 1.36 0 3 No
34 0.15 11.62 5.92 1.42 0 3 No
55 0.31 11.29 5.95 1.02 0 3 No
64 0.25 0.82 2.77 0 0 2 No
86 0.02 9.65 1.82 0.10 0 3 No
89 0.13 3.19 1.55 1.77 0 3 No
Sliver 5
Multis 0.15
如果任何 d_id 在 Sliver 中的值小于 5,并且任何两个 multi(总共有 4 个 Multi)因为 d_id 的值小于 0.15 那么 Flag变量被赋予 Yes 或 No。在上面的示例中,只有 25 满足条件,因此被标记为是。
有人可以帮我解决这些问题吗?
按条件使用numpy.where
:
mask = df.filter(like='Multi').lt(.15).all(1) & df['Sliver'].lt(5)
#alternative
#mask = df.drop(['d_id','no_of_prem', 'Sliver'], axis=1).lt(.15).all(1) & df['Sliver'].lt(5)
df['Flag_Sliver'] = np.where(mask, 'Yes' ,'No')
print (df)
d_id Sliver Multi_A Multi_B Multi_C Multi_D no_of_prem Flag_Sliver
0 5 4.80 53.05 19.07 13.59 0 3 No
1 18 5.17 27.63 26.83 12.15 0 3 No
2 25 1.28 0.14 0.12 0.00 0 2 Yes
3 32 0.90 0.43 0.94 0.00 0 2 No
4 33 3.69 3.24 0.77 1.36 0 3 No
5 34 0.15 11.62 5.92 1.42 0 3 No
6 55 0.31 11.29 5.95 1.02 0 3 No
7 64 0.25 0.82 2.77 0.00 0 2 No
8 86 0.02 9.65 1.82 0.10 0 3 No
9 89 0.13 3.19 1.55 1.77 0 3 No
解释:
首先 select 所有 Multi
列 filter
or drop
不必要的列:
print (df.filter(like='Multi'))
#print (df.drop(['d_id','no_of_prem', 'Sliver'], axis=1))
Multi_A Multi_B Multi_C Multi_D
0 53.05 19.07 13.59 0
1 27.63 26.83 12.15 0
2 0.14 0.12 0.00 0
3 0.43 0.94 0.00 0
4 3.24 0.77 1.36 0
5 11.62 5.92 1.42 0
6 11.29 5.95 1.02 0
7 0.82 2.77 0.00 0
8 9.65 1.82 0.10 0
9 3.19 1.55 1.77 0
比较 .15
与 lt
(<
):
print (df.filter(like='Multi').le(.15))
Multi_A Multi_B Multi_C Multi_D
0 False False False True
1 False False False True
2 True True True True
3 False False True True
4 False False False True
5 False False False True
6 False False False True
7 False False True True
8 False False True True
9 False False False True
通过 DataFrame.all
:
获取全部 True
s 行
print (df.filter(like='Multi').le(.15).all(1))
0 False
1 False
2 True
3 False
4 False
5 False
6 False
7 False
8 False
9 False
dtype: bool
还比较第 Sliver
列:
print (df['Sliver'].lt(5))
0 True
1 False
2 True
3 True
4 True
5 True
6 True
7 True
8 True
9 True
Name: Sliver, dtype: bool
并通过 &
(AND
) 链接:
mask = df.filter(like='Multi').lt(.15).all(1) & df['Sliver'].lt(5)
print (mask)
0 False
1 False
2 True
3 False
4 False
5 False
6 False
7 False
8 False
9 False
dtype: bool
我在 pd 数据框中有以下数据:
Sliver 和 OThers(像所有 Multi 一样 - Multi_A 等)的截止值如下:
d_id Sliver Multi_A Multi_B Multi_C Multi_D no_of_prem Flag_Sliver
5 4.80 53.05 19.07 13.59 0 3 No
18 5.17 27.63 26.83 12.15 0 3 No
25 1.28 0.14 0.12 0 0 2 Yes
32 0.90 0.43 0.94 0 0 2 No
33 3.69 3.24 0.77 1.36 0 3 No
34 0.15 11.62 5.92 1.42 0 3 No
55 0.31 11.29 5.95 1.02 0 3 No
64 0.25 0.82 2.77 0 0 2 No
86 0.02 9.65 1.82 0.10 0 3 No
89 0.13 3.19 1.55 1.77 0 3 No
Sliver 5
Multis 0.15
如果任何 d_id 在 Sliver 中的值小于 5,并且任何两个 multi(总共有 4 个 Multi)因为 d_id 的值小于 0.15 那么 Flag变量被赋予 Yes 或 No。在上面的示例中,只有 25 满足条件,因此被标记为是。
有人可以帮我解决这些问题吗?
按条件使用numpy.where
:
mask = df.filter(like='Multi').lt(.15).all(1) & df['Sliver'].lt(5)
#alternative
#mask = df.drop(['d_id','no_of_prem', 'Sliver'], axis=1).lt(.15).all(1) & df['Sliver'].lt(5)
df['Flag_Sliver'] = np.where(mask, 'Yes' ,'No')
print (df)
d_id Sliver Multi_A Multi_B Multi_C Multi_D no_of_prem Flag_Sliver
0 5 4.80 53.05 19.07 13.59 0 3 No
1 18 5.17 27.63 26.83 12.15 0 3 No
2 25 1.28 0.14 0.12 0.00 0 2 Yes
3 32 0.90 0.43 0.94 0.00 0 2 No
4 33 3.69 3.24 0.77 1.36 0 3 No
5 34 0.15 11.62 5.92 1.42 0 3 No
6 55 0.31 11.29 5.95 1.02 0 3 No
7 64 0.25 0.82 2.77 0.00 0 2 No
8 86 0.02 9.65 1.82 0.10 0 3 No
9 89 0.13 3.19 1.55 1.77 0 3 No
解释:
首先 select 所有 Multi
列 filter
or drop
不必要的列:
print (df.filter(like='Multi'))
#print (df.drop(['d_id','no_of_prem', 'Sliver'], axis=1))
Multi_A Multi_B Multi_C Multi_D
0 53.05 19.07 13.59 0
1 27.63 26.83 12.15 0
2 0.14 0.12 0.00 0
3 0.43 0.94 0.00 0
4 3.24 0.77 1.36 0
5 11.62 5.92 1.42 0
6 11.29 5.95 1.02 0
7 0.82 2.77 0.00 0
8 9.65 1.82 0.10 0
9 3.19 1.55 1.77 0
比较 .15
与 lt
(<
):
print (df.filter(like='Multi').le(.15))
Multi_A Multi_B Multi_C Multi_D
0 False False False True
1 False False False True
2 True True True True
3 False False True True
4 False False False True
5 False False False True
6 False False False True
7 False False True True
8 False False True True
9 False False False True
通过 DataFrame.all
:
True
s 行
print (df.filter(like='Multi').le(.15).all(1))
0 False
1 False
2 True
3 False
4 False
5 False
6 False
7 False
8 False
9 False
dtype: bool
还比较第 Sliver
列:
print (df['Sliver'].lt(5))
0 True
1 False
2 True
3 True
4 True
5 True
6 True
7 True
8 True
9 True
Name: Sliver, dtype: bool
并通过 &
(AND
) 链接:
mask = df.filter(like='Multi').lt(.15).all(1) & df['Sliver'].lt(5)
print (mask)
0 False
1 False
2 True
3 False
4 False
5 False
6 False
7 False
8 False
9 False
dtype: bool