python - 通过仅包含彼此相隔一个月的行来过滤数据框
问题描述
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()
.
但我无法弄清楚我应该如何将它应用于整个数据帧,以便它为我提供有关在一个月的时间范围内重复发生气旋活动的位置的信息。有人可以帮我实现这一目标吗?
解决方案
如果您有记忆,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']
并使用唯一值来子集 original DataFrame
,或使用pd.wide_to_long
on merged
+drop_duplicates
将其格式化回原始外观。
推荐阅读
- haskell - 为自定义 `Maybe` 数据类型派生 monoid 实例
- javascript - JavaScript RegExp 用于电话号码验证,需要在数字之间允许连字符和空格
- python - 尝试使用 _offsets3d 更新 3d 散点图时出现“元组对象不可调用”
- python-3.x - 如何将字符串格式化为十六进制,然后再格式化为二进制?
- vb.net - VB中处理MIDI多系统独占消息的输入
- laravel - Laravel 最长执行时间超过 60 秒
- android - 自定义主题选项卡布局
- r - 解释/解释预测结果
- sql - 从 firebird 2.5 中的周数获取开始和结束日期
- json - 在 Clojure 中迭代一个 json 对象数组