如何在数据帧中选择两个日期内的行?

2024-04-23 17:08:12 发布

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

我有一个数据帧,例如:

ids    year    month    visit_counts
112    2012      1           5
112    2012      5           25
414    2012      2           10
112    2013      5           10
414    2012      4           35
112    2013      8           16
112    2013     12           23
112    2014      2           20
112    2014      4           28
414    2013      6           15
414    2013     11           30
414    2014      2           24
414    2014      7           17

每一行代表一条记录,记录上有发生的日期。假设,与id 112相关联的第一个发生日期是(2012年和1月(1)),并且不同id的第一个发生日期是不同的。我需要创建新的dataframe,其中对于每个id,我希望在自第一个发生日期起的两年内拥有所有记录。你知道吗

因此,输出数据帧应该如下所示:

ids    year    month    visit_counts
112    2012      1           5
112    2012      5           25
414    2012      2           10
112    2013      5           10
414    2012      4           35
112    2013      8           16
112    2013     12           23
414    2013      6           15
414    2013     11           30
414    2014      2           24

如果有人能提供代码,那会很有帮助的。谢谢您!你知道吗


Tags: 数据代码ididsdataframe记录代表visit
3条回答

首先,我们创建一个助手列time_in_months,以便能够比较日期。然后使用.groupby.transform查找距离最短日期最多24个月的日期,并筛选这些日期。你知道吗

df['time_in_months'] = df['year'] * 12 + df['month']
df[df.groupby('ids').time_in_months.transform(lambda x: x -x.min() <= 24  )].drop('time_in_months', 1)

结果

        ids     year    month visit_counts
0       112     2012    1     5
1       112     2012    5     25
2       414     2012    2     10
3       112     2013    5     10
4       414     2012    4     35
5       112     2013    8     16
6       112     2013    12    23
9       414     2013    6     15
10      414     2013    11    30
11      414     2014    2     24

使用datetime64。我们创建一个日期,使用groupby+transform来获得每个ID的第一个日期,然后我们可以使用一个简单的布尔掩码在2年内只保留行。你知道吗

我把多余的几列留着做插图,不过如果你愿意的话,可以把它们删掉。你知道吗

import pandas as pd

df['date'] = pd.to_datetime(df.assign(day=1)[['year', 'month', 'day']])
df['first_d'] = df.groupby('ids').date.transform('min')
m = df.date <= df.first_d + pd.offsets.DateOffset(years=2)

df.loc[m]

    ids  year  month  visit_counts       date    first_d
0   112  2012      1             5 2012-01-01 2012-01-01
1   112  2012      5            25 2012-05-01 2012-01-01
2   414  2012      2            10 2012-02-01 2012-02-01
3   112  2013      5            10 2013-05-01 2012-01-01
4   414  2012      4            35 2012-04-01 2012-02-01
5   112  2013      8            16 2013-08-01 2012-01-01
6   112  2013     12            23 2013-12-01 2012-01-01
9   414  2013      6            15 2013-06-01 2012-02-01
10  414  2013     11            30 2013-11-01 2012-02-01
11  414  2014      2            24 2014-02-01 2012-02-01

这里有一个方法

s=df.eval('year*12+month')
df[s<s.groupby(df['ids']).transform('min')+24]
    ids  year  month  visit_counts
0   112  2012      1             5
1   112  2012      5            25
2   414  2012      2            10
3   112  2013      5            10
4   414  2012      4            35
5   112  2013      8            16
6   112  2013     12            23
9   414  2013      6            15
10  414  2013     11            30

相关问题 更多 >