python - 如何按自定义重叠周期对 pandas 数据框进行分组?

标签 python pandas group-by pandas-groupby period

假设我有一个列表列表,其中每个嵌套列表都有两个值:范围的开始日期和范围的结束日期。所以像这样:

ranges_list = [
    ['2020-03-12', '2020-06-12'],
    ['2020-03-13', '2020-06-13'],
    ['2020-03-14', '2020-06-14']
]

这代表 3 个范围:

  1. 2020年3月12日 - 2020年6月12日
  2. 2020年3月13日 - 2020年6月13日
  3. 2020年3月14日 - 2020年6月14日

假设我还有一些数据框 d,它具有多个列,其中一列名为 'occurrence_date',其中包含日期时间。

假设数据帧d看起来像:

ID      LinkID   PC    occurence_date
10R46   R*1005   8017  2020-03-12
10R46   R*10335  5019  2020-04-15
100R91  R*1005   8017  2020-04-15
10R91   R*243    8870  2020-06-14

我想使用 ranges_list 中指定的范围内的 occurrence_date 列对数据帧 d 进行分组

所以类似:

grouped = d.groupby('occurence_date', ranges=ranges_list)

显然,这个groupby代码是不正确的,但有助于满足我想要做的事情。

最后,分组的对象应该有 3 个不同的组,如下所示:

group: ('2020-03-12', '2020-06-12')
ID      LinkID   PC    occurence_date
10R46   R*1005   8017  2020-03-12
10R46   R*10335  5019  2020-04-15
100R91  R*1005   8017  2020-04-15

group: ('2020-03-13', '2020-06-13')
ID      LinkID   PC    occurence_date
10R46   R*10335  5019  2020-04-15
100R91  R*1005   8017  2020-04-15

group: ('2020-03-14', '2020-06-14')
ID      LinkID   PC    occurence_date
10R46   R*10335  5019  2020-04-15
100R91  R*1005   8017  2020-04-15
10R91   R*243    8870  2020-06-14

我怎样才能实现这个目标?

最佳答案

您可以按pd.IntervalIndex分组:

ranges_list = [
    (pd.Timestamp('2020-03-12'), pd.Timestamp('2020-06-12')),
    (pd.Timestamp('2020-03-13'), pd.Timestamp('2020-06-13')),
    (pd.Timestamp('2020-03-14'), pd.Timestamp('2020-06-14'))
]

idx = pd.IntervalIndex.from_tuples(ranges_list, closed='both')

def in_ranges(x, bins):
    rv = []
    for b in bins:
        if x in b:
            rv.append(b)
    return rv

df['groups'] = df['occurence_date'].apply(lambda x: in_ranges(x, idx))

for g in df.explode('groups').groupby('groups'):
    print(g[0])
    print('-' * 80)
    print(g[1][['ID', 'LinkID', 'PC', 'occurence_date']])
    print()

打印:

[2020-03-12, 2020-06-12]
--------------------------------------------------------------------------------
       ID   LinkID    PC occurence_date
0   10R46   R*1005  8017     2020-03-12
1   10R46  R*10335  5019     2020-04-15
2  100R91   R*1005  8017     2020-04-15

[2020-03-13, 2020-06-13]
--------------------------------------------------------------------------------
       ID   LinkID    PC occurence_date
1   10R46  R*10335  5019     2020-04-15
2  100R91   R*1005  8017     2020-04-15

[2020-03-14, 2020-06-14]
--------------------------------------------------------------------------------
       ID   LinkID    PC occurence_date
1   10R46  R*10335  5019     2020-04-15
2  100R91   R*1005  8017     2020-04-15
3   10R91    R*243  8870     2020-06-14

关于python - 如何按自定义重叠周期对 pandas 数据框进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66620092/

相关文章:

Python 锁定临界区

python - 在python3中,如何测试工作空间根目录下的.py文件?

python - 如何为我的数据创建条形图?

python - Pandas:将日期 'object' 转换为 int

sql - 是否可以将Group by,Having和Sum组合在一起?

python - 无法使用 Python 2.7 重新编译 mod_wsgi

python - 如何将时间戳转换为df以excel python?

python - 为什么这段代码会抛出SettingWithCopyWarning?

SQL 在 group by 中忽略大小写? (神谕)

mysql - GROUP BY MySQL中GROUP BY返回的行数