Фильтр фрейма данных по условию - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть такой фрейм данных, как

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 голосов
/ 13 февраля 2019

Не принимайте это всерьез

Я просто экспериментирую

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
0 голосов
/ 13 февраля 2019

с использованием 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
0 голосов
/ 13 февраля 2019

Вы можете использовать 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
0 голосов
/ 13 февраля 2019

Мой любимый вариант - использовать цепочку mask(), например:

df["final"] = df["colA"] \
              .mask(df["colB"].eq("D"), "D") \
              .mask(df["colC"].eq("E"), "E")

Это для представления последовательности if-then-elif в точном обратном порядке проверки, но в остальном очень удобочитаемой.

0 голосов
/ 13 февраля 2019

Создайте условие 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...