只显示pandas中日期范围行的交集

2024-04-19 05:19:58 发布

您现在位置:Python中文网/ 问答频道 /正文

here开始

import pandas as pd

data = {'date': ['1998-03-01 00:00:01', '2001-04-01 00:00:01','1998-06-01 00:00:01','2001-08-01 00:00:01','2001-05-03 00:00:01','1994-03-01 00:00:01'], 
        'node1': [1, 1, 2,2,3,2],
     'node2': [8,316,26,35,44,56],
     'weight': [1,1,1,1,1,1], }
df = pd.DataFrame(data, columns = ['date', 'node1','node2','weight'])

df['date'] = pd.to_datetime(df['date'])

mask = df.groupby('node1').apply(lambda x : (x['date'].dt.year.isin([1998,1999,2000])).any())
mask2 = df.groupby('node1').apply(lambda x : (x['date'].dt.year.isin([2001,2002,2003])).any())


print df[df['node1'].isin(mask[mask & mask2].index)]

我需要的输出是在年份范围(98-00)和(01-03)中的节点,但是它应该只显示两个范围内的行。在

预期输出-

^{pr2}$

现在这个代码也在打印这一行:2561994-03-01也是。在


Tags: lambdadfdatadatedtanymaskyear
1条回答
网友
1楼 · 发布于 2024-04-19 05:19:58

一个简单的解决方案是首先删除不在两个日期范围内的日期,然后应用掩码,即

l1 = [1998,1999,2000]
l2 = [2001,2002,2003]
ndf = df[df['date'].dt.year.isin(l1+l2)]

获得ndf后:

选项1:您可以采用基于掩码的双分组方法,即

^{pr2}$

谢谢@Zero

选项2:您可以使用groupby转换

new = ndf[ndf.groupby('node1')['date'].transform(lambda x: x.dt.year.isin(l1).any() & x.dt.year.isin(l2).any())]

选项3:分组筛选

new = ndf.groupby('node1').filter(lambda x: x['date'].dt.year.isin(l1).any() & x['date'].dt.year.isin(l2).any())

输出:

                 date  node1  node2  weight
0 1998-03-01 00:00:01      1      8       1
1 2001-04-01 00:00:01      1    316       1
2 1998-06-01 00:00:01      2     26       1
3 2001-08-01 00:00:01      2     35       1

相关问题 更多 >