Python фильтр строк с условием - PullRequest
0 голосов
/ 16 февраля 2020

Привет, у меня есть датафрейм, который выглядит следующим образом

        Date     Col1         Col2         Col3       col4 
0     1-4-2020    a        ed kv sc        sf ds       n
1     1-4-2020    b        hed sf ed       df hed      c
2     1-4-2020    c        df xz sf        sf ds       n
3     2-4-2020    a        ed df hed       sf ds       n
4     2-4-2020    b        gv bb sc        s ds        c
5     2-4-2020    c        ed sf sc        hed ds      n

Что я хочу сделать, это отфильтровать строки с несколькими условиями. Если:

  • Строки буксировки имеют одинаковое значение в Col1. Например, a == a
  • И они имеют одинаковые значения в Col4. n == n
  • Если оба условия истинны, ищите строки Col2 и Col3 для ключевых строк "hed" и "sf". они могут быть в Col2 или Col3 (или в обоих)

Поэтому результат будет выглядеть следующим образом:

       Date     Col1         Col2         Col3       col4 
1     1-4-2020    b        hed sf ed      df hed       c
3     2-4-2020    a        ed df hed      sf djs       n
5     2-4-2020    c        ed sf ssc      hed djs      n

Надеюсь, это понятно Обновление

В case Col4

        Date     Col1         Col2         Col3       col4 
0     1-4-2020    a        ed kv sc        sf ds       n
1     1-4-2020    b        hed sf ed       df hed      c
2     1-4-2020    c        df xz sf        sf ds       n
3     1-4-2020    d        df xdg sf       sf hed      y 
4     2-4-2020    a        ed df hed       sf ds       n
5     2-4-2020    b        gv bb sc        s ds        c
6     2-4-2020    c        ed sf sc        hed ds      n
7     2-4-2020    d        df xgfgf       gf gfd       null

В случае, если значение в Col4 появляется только один раз в кадре данных, как в строке 3 (подсказка, что нет следующей строки для сравнения), функция должна вернуть строку.

        Date     Col1         Col2         Col3       col4 
1     1-4-2020    b        hed sf ed       df hed      c
3     1-4-2020    d        df xdg sf       sf hed      y 
4     2-4-2020    a        ed df hed       sf ds       n
6     2-4-2020    c        ed sf sc        hed ds      n

1 Ответ

1 голос
/ 16 февраля 2020

Сначала получите количество строк с одинаковыми Col1 и Col4 на GroupBy.transform с GroupBy.size и объедините столбец Col2 с Col3 вместе:

count = df.groupby(['Col1','col4'])['col4'].transform('size')
s = (df['Col2'] + ' ' + df['Col3'])

Вы можете проверить вывод:

print (df.assign(count=count, both=s))
       Date Col1       Col2    Col3 col4  count              both
0  1-4-2020    a   ed kv sc   sf ds    n      2    ed kv sc sf ds
1  1-4-2020    b  hed sf ed  df hed    c      2  hed sf ed df hed
2  1-4-2020    c   df xz sf   sf ds    n      2    df xz sf sf ds
3  2-4-2020    a  ed df hed   sf ds    n      2   ed df hed sf ds
4  2-4-2020    b   gv bb sc    s ds    c      2     gv bb sc s ds
5  2-4-2020    c   ed gf sc  hed ds    n      2   ed gf sc hed ds

Последний фильтр по boolean indexing, если число равно 2 по Series.eq , тогда Series.str.contains для тестовых подстрок и связанной маски вместе на & для побитового И:

df = df[count.eq(2) & s.str.contains('hed') & s.str.contains('sf')]
print (df)
       Date Col1       Col2    Col3 col4
1  1-4-2020    b  hed sf ed  df hed    c
3  2-4-2020    a  ed df hed   sf ds    n
...