Применение условия в Pandas - PullRequest
0 голосов
/ 09 июля 2020

У меня есть набор данных с более чем 20000 строками, который выглядит примерно так:

dataset.head()

Итак, я хочу сохранить только те идентификаторы, которые имеют в качестве даты: 2018, 2017 и 2016 вместе взятые (а не только один из них). Например: у меня не будет Id 1, но будет Id 3. Как я могу сделать это в Pandas?

Извините, если вопрос звучит для вас глупо, я просто beguinner .. Спасибо!

Ответы [ 3 ]

0 голосов
/ 09 июля 2020

Поскольку 20 000 строк не являются «большим» набором данных, вы можете обойтись относительно простым методом, используя операции группировки и установки:

def has_dates(x, dates={2016, 2017, 2018}):
    return dates.issubset(set(x))

grouped = dataset.groupby('ID_NUMBER')
mask = grouped.DATE.unique().apply(has_dates)

print(mask[mask].index.values)

Здесь мы группируем данные по ID_NUMBER, чтобы получить сгруппированные кадры для каждого идентификатора, а затем проверить, является ли желаемый dates, который вы ищете, подмножеством уникальных дат, связанных с этим конкретным индексом.

mask - это логическая серия, которая равна True для идентификаторов, соответствующих вашему условию, поэтому вы можете получить его значения индекса, чтобы просмотреть все идентификаторы, которые вас интересуют, или, альтернативно, используйте dataset.loc[mask[mask].index] для извлечения строк из вашего набора данных.

0 голосов
/ 09 июля 2020

Мне не понятно, интересует ли вас еще и третий столбец? Если все, что вам нужно, это список всех ID_NUMBER, которые появляются для всех трех дат, самым простым решением, на мой взгляд, является

def get_num_id(date):
    r_dataset = dataset[dataset['DATE'] == date]
    return set(r_dataset['NUMBER_ID'])

s = get_num_id(2016) & get_num_id(2017) & get_num_id(2018) # is a set
l = list(s) # if you prefer a list
0 голосов
/ 09 июля 2020

попробуйте это, используйте set intersection, чтобы определить совпадающие годы и boolean indexing, чтобы извлечь те идентификаторы, которые соответствуют критериям.

df = pd.DataFrame({"id": [1, 1, 1, 2, 2, 3, 3, 3],
                   "date": [2016, 2017, 2018, 2016, 2017, 2016, 2017, 2018]})

year_ = {2016, 2017, 2018}

filter_ = (
    df.groupby('id')['date'].agg(list).apply(
        lambda x: True if len(set(x).intersection(year_)) == len(year_) else False)
)

print(filter_[filter_.eq(1)].index.values)

[1 3]
...