Исключить определенные значения при проверке состояния с пандами - PullRequest
0 голосов
/ 18 января 2019

У меня есть следующий фрейм данных (фактические столбцы в фрейме данных больше 30)

ID  col1    col2    col3   col4
 1  a##      b##    HO      HO
 2  c##      d23   c##      HO
 3  a##      k##    z##     s#
 4  c##      b12    a12     c12
 5   b##     HO     z##      HO

Я хочу создать новую строку фильтрации данных, имеющую все строки, заканчивающиеся на «##», и если одна из ячеек в строке содержит «HO», я хочу пропустить это и вернуть строку, если остальные столбцы содержат строку, заканчивающуюся ##

В приведенном выше случае новый кадр данных будет выглядеть так:

ID  col1    col2    col3  col4
1   a##      b##    HO    HO
3   a##      k##    z##   s#
5   b##      HO     z##   HO

В настоящее время я делаю

m = np.logical_and.reduce([
[x.endswith('##')  for x in df[c] ] for c in df.columns if x!='HO'] )

Но df [m] дает только одну следующую строку, а не две другие

3   a##      k##    z##

Как я могу это исправить?

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Вы можете заменить «HO» фиктивной строкой «##», сохранить этот результат как временный DataFrame, вычислить маску для temp и использовать ее для индексации обратно в df.

# df = df.set_index('ID')  # Run this if not already done.
df

  col1 col2 col3
ID               
1   a##  b##   HO
2   c##  d23  c##
3   a##  k##  z##
4   c##  b12  a12
5   b##   HO  z##

u = df.replace('HO', '##')
m = np.logical_and.reduce([
   [x.endswith('##')  for x in u[c]] for c in u.columns]
)
df[m]

   col1 col2 col3
ID               
1   a##  b##   HO
3   a##  k##  z##
5   b##   HO  z##
0 голосов
/ 18 января 2019

Вы можете попробовать это:

import pandas as pd
import numpy as np

data = {'col1':['a##', 'c##', 'a##', 'c##', 'b##'], 'col2':['b##', 'd23', 'k##', 'b12', 'HO'], 'col3': ['HO', 'c##', 'z##', 'a12', 'z##']}

df = pd.DataFrame(data = data)

m = np.logical_and.reduce([[('##' in x) | (x=='HO') for x in df[c] ]for c in df.columns  ])

print(df, '\n\n',df[m])


 col1 col2 col3
0  a##  b##   HO
1  c##  d23  c##
2  a##  k##  z##
3  c##  b12  a12
4  b##   HO  z## 

   col1 col2 col3
0  a##  b##   HO
2  a##  k##  z##
4  b##   HO  z##
0 голосов
/ 18 января 2019

Вы можете комбинировать логические фильтры, как показано ниже. Обратите внимание, что есть только 2 допустимых сценария: либо у вас есть 2 строки, заканчивающиеся на '##', а одна равна 'HO', или у вас есть все 3 строки, заканчивающиеся на '##'.

suffix = df.iloc[:, 1:].apply(lambda s: s.str[-2:].eq('##')).sum(1)
value = df.iloc[:, 1:].eq('HO').sum(1)

res = df[(suffix.eq(2) & value.eq(1)) | suffix.eq(3)]

print(res)

   ID col1 col2 col3
0   1  a##  b##   HO
2   3  a##  k##  z##
4   5  b##   HO  z##
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...