按条件筛选数据框

3

I have a data-frame like

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
5个回答

4
创建条件 Series,使用 bfillfillna 函数完成链式操作。
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

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

1
这就是我要回答的内容。 - piRSquared

3
我最喜欢使用链式mask(),就像这样:
df["final"] = df["colA"] \
              .mask(df["colB"].eq("D"), "D") \
              .mask(df["colC"].eq("E"), "E")

这是为了以检查的相反顺序呈现您的if-then-elif序列,但其它方面非常易读。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接