根据条件的数据帧过滤器

时间:2019-02-13 15:51:54

标签: python pandas numpy dataframe

我有一个类似

的数据框
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 个答案:

答案 0 :(得分: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

答案 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