如何用单行代码基于时长过滤Pandas DataFrame行(忽略日期)
基于时间条件(忽略日期)删除DataFrame行(多采样频率场景)
问题描述
我有一个约1亿行、100列的大型DataFrame,各列采样频率不同。希望**仅基于时间(忽略日期)**删除时长为0.1秒的行,保留时长为0.01秒的行。以下是模拟多采样频率的测试代码:
import pandas as pd # leave_duration=0.01 seconds # drop_duration=0.1 seconds i = pd.date_range('2018-01-01', periods=1000, freq='2ms') i=i.append(pd.date_range('2018-01-01', periods=1000, freq='3ms')) i=i.append(pd.date_range('2018-01-01', periods=1000, freq='0.5ms')) df = pd.DataFrame({'A': range(len(i))}, index=i) df=df.sort_index() print(df) # drop by duration....
示例数据时长约1秒,包含3种采样频率,求单行代码实现目标。
解决方案
嘿,针对你的需求,这里有个单行代码可以直接实现,同时考虑到你数据量巨大,我也加了优化方向:
核心单行代码
df = df[df.index.to_series().diff().dt.total_seconds().fillna(0.01) == 0.01]
代码拆解
df.index.to_series():把Datetime索引转成Series,方便计算相邻时间差.diff():计算当前行与上一行的时间间隔(第一行没有上一行,结果是NaN).dt.total_seconds():把时间差转成秒数,方便和你的目标时长对比.fillna(0.01):给第一行补个默认值——这里直接用要保留的0.01秒,如果你业务里第一行需要特殊处理,改这个值就行== 0.01:筛选出时间间隔恰好是0.01秒的行,也就是留下你要的记录
针对1亿行数据的优化提示
直接用上面的代码可能会有内存压力,给你两个优化方向:
- 转成numpy数组再筛选,减少内存占用:
df = df[(df.index.to_series().diff().dt.total_seconds().fillna(0.01).to_numpy() == 0.01)] - 用
drop()结合反向筛选,避免复制整个DataFrame:df.drop(df[df.index.to_series().diff().dt.total_seconds().fillna(0.01) != 0.01].index, inplace=True)
内容的提问来源于stack exchange,提问作者Tomasz
相关产品推荐
相关产品推荐

