Удалить строки из кадра данных на основе других строк в том же кадре данных - PullRequest
2 голосов
/ 14 октября 2019

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

     date    | test_hour
------------+-----------
 2000-01-01 |         1
 2000-01-01 |         2
 2000-01-01 |         3
 2000-01-02 |         1
 2000-01-02 |         2
 2000-01-02 |         3
 2000-01-02 |         4
 2000-01-03 |         1
 2000-01-03 |         2

Мне нужно отбросить все даты, пропущенные test_hours = 1, 2 и 3. Поэтому результирующий фрейм данных не должен содержать строки с 2000-01-03,потому что он отсутствует test_hour = 3:

     date    | test_hour
------------+-----------
 2000-01-01 |         1
 2000-01-01 |         2
 2000-01-01 |         3
 2000-01-02 |         1
 2000-01-02 |         2
 2000-01-02 |         3
 2000-01-02 |         4

В настоящее время я использую цикл for, чтобы выяснить, какие даты отбрасывать, но это, похоже, лишает смысла использование фрейма данных. Какой более эффективный способ сделать это?

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Вот один из способов использования filter с isin и all

df.groupby('date').filter(lambda x : pd.Series([1,2,3]).isin(x['test_hour']).all())
         date  test_hour
0  2000-01-01          1
1  2000-01-01          2
2  2000-01-01          3
3  2000-01-02          1
4  2000-01-02          2
5  2000-01-02          3
6  2000-01-02          4
1 голос
/ 14 октября 2019

transform и lambda

df[df.groupby('date').test_hour.transform(lambda x: {1, 2, 3} <= {*x})]

и понимание map

df[df.date.map({k: {1, 2, 3} <= {*x} for k, x in df.groupby('date').test_hour})]

Чуть более эзотерическая версия map

df[[*map({k: {1, 2, 3} <= {*x} for k, x in df.groupby('date').test_hour}.get, df.date)]]

Вся доходность

         date  test_hour
0  2000-01-01          1
1  2000-01-01          2
2  2000-01-01          3
3  2000-01-02          1
4  2000-01-02          2
5  2000-01-02          3
6  2000-01-02          4
0 голосов
/ 14 октября 2019

С библиотекой pandas-sets (https://github.com/Florents-Tselai/pandas-sets) и transform вы можете получить довольно удобочитаемое решение:

import pandas_sets
import pandas as pd


df = pd.DataFrame({
        'date': ['2000-01-01', '2000-01-01', '2000-01-01', '2000-01-01', '2000-01-02'],
        'test_hour': [1, 2, 3, 4, 1]
        })

df = df[df.groupby('date').transform(set)['test_hour'].set.issuperset({1,2,3})]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...