我有一个类似
的数据框colA colB colC
A B C
A D C
B B E
A D C
C B C
我想像这样优先过滤它们: 如果colC == E,则返回E,之后检查colB == D,返回D,否则返回colA 输出是
colA colB colC final
A B C A
A D C D
B B E E
A D C D
C B C C
答案 0 :(得分:4)
创建条件Series
,并创建具有bfill
和fillna
的链
s=pd.Series({'colB':'D','colC':'E'})
df['New']=df.where(df.eq(s)).bfill(1).iloc[:,0].fillna(df.colA)
>>> df
colA colB colC New
0 A B C A
1 A D C D
2 B B E E
3 A D C D
4 C B C C
答案 1 :(得分:4)
您可以使用np.select
,它允许您根据条件列表在多个值中进行选择:
m1 = df.colC =='E'
m2 = df.colB =='D'
df.loc[:,'final'] = np.select([m1,m2], ['E', 'D'], default=df.colA)
colA colB colC final
0 A B C A
1 A D C D
2 B B E E
3 A D C D
4 C B C C
答案 2 :(得分:3)
我最喜欢的是使用链式mask()
,如下所示:
df["final"] = df["colA"] \
.mask(df["colB"].eq("D"), "D") \
.mask(df["colC"].eq("E"), "E")
这是按照与检查完全相反的顺序显示if-then-elif序列,但否则可读性很强。
答案 3 :(得分:3)
我只是在尝试
a = df.colA.values.copy() # Set lowest priority first
a[np.flatnonzero(df.colB == 'D')] = 'D' # And on down the line
a[np.flatnonzero(df.colC == 'E')] = 'E' # Highest priority last
df.assign(New=a)
colA colB colC New
0 A B C A
1 A D C D
2 B B E E
3 A D C D
4 C B C C
答案 4 :(得分:2)
使用 np.where
t['final'] = np.where(t['colC'] == 'E', 'E', (np.where(t['colB'] == 'D', 'D', t['colA'])))
输出
colA colB colC final
0 A B C A
1 A D C D
2 B B E E
3 A D C D
4 C B C C