Отфильтруйте фрейм данных, имея только те строки, которые находятся на расстоянии месяца друг от друга. - PullRequest
0 голосов
/ 06 декабря 2018
Date    Latitude    Longitude   Disaster
2011-01-10  56.79   89.90   Cyclone
2011-02-09  45.01   79.24   Cyclone
2010-11-20  34.08   69.92   Cyclone
2010-12-19  66.78   125.35  Cyclone
2017-09-10  56.99   98.22   Cyclone

У меня есть фрейм данных, который мне нужно отфильтровать, чтобы он содержал данные о том, где циклоническая активность неоднократно происходила в течение одного месяца .
Я использовал операцию слияния длянайти пары циклонов в одном и том же месте -

merged_df = df.merge(df, on= ["Longitude","Latitude"], how ="inner")

Мне удалось найти данные в течение месяца за конкретную дату, скажем: 2002-01-01, используя

df[dt['Date'] >= date(2002,1,1) & df['Date'] < date(2002,1,1) + relativedelta(months=1)].count().

, но я не могу понять, как мне применить его ко всему фрейму данных, чтобы он давал мне информацию о том, где циклоническая активность повторялась в течение одного месяца.Может ли кто-нибудь помочь мне достичь этого?

1 Ответ

0 голосов
/ 06 декабря 2018

Если у вас есть память, merge с самим собой, а затем фильтруйте после объединения только те циклоны, которые происходят в течение 1 месяца.Используйте pd.offsets.DateOffset, чтобы получить ту же логику, что и relativedelta

import pandas as pd

df['Date'] = pd.to_datetime(df.Date)
df = df[df.Disaster=='Cyclone'].reset_index()  # Need index to deduplicate later

merged = df.merge(df, on='Disaster', suffixes=['_1', '_2'])

mask = ((merged.index_1 > merged.index_2)  # Remove self merges and AB-BA duplicates
        & merged.Date_1.between(merged.Date_2 - pd.offsets.DateOffset(months=1), 
                                merged.Date_2 + pd.offsets.DateOffset(months=1)))

merged = merged[mask].drop(columns=['index_1', 'index_2'])

Вывод: merged

       Date_1  Latitude_1  Longitude_1 Disaster     Date_2  Latitude_2  Longitude_2
5  2011-02-09       45.01        79.24  Cyclone 2011-01-10       56.79        89.90
15 2010-12-19       66.78       125.35  Cyclone 2011-01-10       56.79        89.90
17 2010-12-19       66.78       125.35  Cyclone 2010-11-20       34.08        69.92

Если вам действительно нужны строки из исходного DataFrameи пары бесполезны, тогда не пропускайте ['index_1', 'index_2'] и используйте уникальные значения для подстановки оригинала DataFrame, или используйте pd.wide_to_long для merged + drop_duplicates, чтобы отформатировать его так, как выглядел оригинал.

...