假设我有一个列表列表,其中每个嵌套列表都有两个值:范围的开始日期和范围的结束日期。所以像这样:
ranges_list = [
['2020-03-12', '2020-06-12'],
['2020-03-13', '2020-06-13'],
['2020-03-14', '2020-06-14']
]
这代表 3 个范围:
- 2020年3月12日 - 2020年6月12日
- 2020年3月13日 - 2020年6月13日
- 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/