我在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且该d_id中的任何两个(总共有4个Multi)的d_id值小于0.15,那么Flag变量将给出Yes或者否。在上面的例子中,只有25符合条件,因此被标记为是。
有人可以帮助我解决这些问题吗?
答案 0 :(得分:2)
按条件使用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
<强>解释强>:
首先按filter
或drop
不必要的列选择所有Multi
列:
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
获取所有True
行
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