if-then 2018/12/31
============================================================
1.if-then / if-then-else用在一个数据帧上:
# 实例1:if-then-else
df = pd.DataFrame({'A': [10,11,12],'B': [20,21,22],'C': [30, 31, -32]})
df.loc[df.A >= 11, 'B'] = -1 #if-then在一列上
df.loc[df.A >= 5, ['B', 'C']] = 88 #if-then分配给2列
df.loc[df.A < 12, ['B', 'C']] = 99 # 添加不同逻辑另一行,以执行-else
#df result1 result2 result3
A B C A B C A B C A B C
0 10 20 30 0 10 20 30 0 10 88 88 0 10 99 99
1 11 21 31 1 11 -1 31 1 11 88 88 1 11 99 99
2 12 22 -32 2 12 -1 -32 2 12 88 88 2 12 88 88
# 实例2:where 矢量化if else
df_bool = pd.DataFrame({'A': [True] * 3, 'B': [False] * 3, 'C': [True, False,True] })
df.where(df_bool, -66)#根据bool值选择
df['logic'] = np.where(df['A'] > 11, 'high', 'low')
#df result4 result5
A B C A B C A B C logic
0 10 99 99 0 10 -66 99 0 10 99 99 low
1 11 99 99 1 11 -66 -66 1 11 99 99 low
2 12 88 88 2 12 -66 88 2 12 88 88 high
# 实例3:
s1=pd.Series([11,np.nan,13,14,np.nan])
s2=pd.Series([np.nan,22,23,24,25])
np.where(pd.isnull(s1),s2,s1)#array([11., 22., 13., 14., 25.])
df1=pd.DataFrame({'a':[11,np.nan,13,14,np.nan],'b':[np.nan,22,23,24,25]})
df2=pd.DataFrame({'a':[np.nan,42,43,np.nan,45],'b':[31,np.nan,33,34,35]})
pd.DataFrame(np.where(pd.isnull(df1),df2,df1),columns=list('ab'))
# df1 df2 result
a b a b a b
0 11.0 NaN 0 NaN 31.0 0 11.0 31.0
1 NaN 22.0 1 42.0 NaN 1 42.0 22.0
2 13.0 23.0 2 43.0 33.0 2 13.0 23.0
3 14.0 24.0 3 NaN 34.0 3 14.0 24.0
4 NaN 25.0 4 45.0 35.0 4 45.0 25.0
============================================================
2.if-then / if-then-else用在2个数据帧上:
实例1:# 若df1>=df2选择df1中数据,否则选择df2中的数据
df1 = pd.DataFrame({'A': [10, 11], 'B': [12, 13]})
df2 = pd.DataFrame({'A': [21, -22], 'B': [23, -24]})
result1=df1[df1>=df2].append(df2[df1<df2]).dropna()
result2=df1[df1.A>df2.B]
result3=df1[df1.A!=11]
# df1 df2 result1 result2 result3
A B A B A B A B A B
0 10 12 0 21 23 0 21 23 1 11 13 0 10 12
1 11 13 1 -22 -24 1 11 13
============================================================