我有一个像下面这样的数据框df
df A B C
0 1 0.7 0.3
1 0 0.2 0.8
2 0 0.8 0.2
3 1 0.6 0.4
4 1 0.9 0.1
我想创建一个列D
,其值是(1-B) if A==1
或(1-C) if A==0
。所以
df A B C D
0 1 0.7 0.3 0.3
1 0 0.2 0.8 0.2
2 0 0.8 0.2 0.8
3 1 0.6 0.4 0.4
4 1 0.9 0.1 0.1
答案 0 :(得分:4)
如果B
和C
列的总和得到1
,则可以使用numpy.where
而不减去:
df['D'] = np.where(df['A'] == 0, df['B'], df['C'])
print (df)
A B C D
0 1 0.7 0.3 0.3
1 0 0.2 0.8 0.2
2 0 0.8 0.2 0.8
3 1 0.6 0.4 0.4
如果要使用公式,并且A
列仅包含1
和0
值:
df['D'] = np.where(df['A'] == 0, 1 - df['C'], 1 - df['B'])
print (df)
A B C D
0 1 0.7 0.3 0.3
1 0 0.2 0.8 0.2
2 0 0.8 0.2 0.8
3 1 0.6 0.4 0.4
4 1 0.9 0.1 0.1
如果A
列中有多个值(最通用的解决方案),请使用numpy.select
:
print (df)
A B C
0 1 0.7 0.3
1 0 0.2 0.8
2 0 0.8 0.2
3 1 0.6 0.4
4 3 0.9 0.1 <- added 3
m1 = df['A'] == 0
m2 = df['A'] == 1
df['D'] = np.select([m1, m2], [1 - df['C'], 1 - df['B']], default=np.nan)
print (df)
A B C D
0 1 0.7 0.3 0.3
1 0 0.2 0.8 0.2
2 0 0.8 0.2 0.8
3 1 0.6 0.4 0.4
4 3 0.9 0.1 NaN
答案 1 :(得分:0)
Capture
和np.select()
是必经之路。
还有一个选择,也可以做
np.where()