python - 添加由不同但重叠的间隔索引的两个系列

标签 python pandas

假设我有以下系列:

import pandas as pd

index1 = pd.IntervalIndex.from_tuples([(1, 3), (2.5, 4), (6, 7)])
x = pd.Series([1, 2, 3], index=index1)

index2 = pd.IntervalIndex.from_tuples([(1, 2), (5, 6.5)])
y = pd.Series([10, 20], index=index2)

z = x+y

理想情况下,这就是我希望 z 的样子:
(1.0, 2.0]    11
(2.0, 2.5]    1
(2.5, 3.0]    3
(3.0, 4.0]    2
(4.0, 5.0]    0
(5.0, 6.0]    20
(6.0, 6.5]    23
(6.5, 7.0]    3

当然,当我添加它们时,我会得到一堆 NaN s,因为索引不对齐。

我应该上采样,然后添加吗? (另外……有没有一种奇特的方法可以在 Pandas 中进行下采样?)

我将如何处理在其自己的索引内具有重叠间隔的系列之一?

语境:

我正在尝试跟踪在特定时间类的学生人数。

我已经修改了类(class)表,当类(class)开始和下课时间不同时,我遇到了问题。

最佳答案

这是我的方法,希望它是不言自明的:

# gather x and y and separate start and end time
df = (pd.concat((x,y))
        .to_frame(name='val')
        .assign(start=lambda x: x.index.left,
                end=lambda x: x.index.right)
     )

# unique time point
idx = (df.index.left.to_series()
    .append(df.index.right.to_series())
    .drop_duplicates()
    .to_frame(name='pt')
    .assign(dummy=1)
)

# cross join, query the valid entries, and sum:
(df.assign(dummy=1)
   .merge(idx, on='dummy')
   .query('start < pt <= end')
   .groupby('pt')
   .val
   .sum()
)

输出(注意pt是每个区间的终点,起点是上一个终点)。
pt
2.0    11
2.5     1
3.0     3
4.0     2
6.0    20
6.5    23
7.0     3
Name: val, dtype: int64

关于python - 添加由不同但重叠的间隔索引的两个系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59310907/

相关文章:

python - flake8 在过滤器子句中提示 bool 比较 "=="

python - 我们如何强制为魔术方法(特殊方法)调用 getattribute() ?

python - 如何在 Django 模型上为相关字段生成索引?

python - 使用来自不同数据集的组均值填充一个数据集中的缺失值

python - Pandas 查找最接近配置文件的行

python - pandas回填并填充不同的值

python - 使用 Python dbapi 转义 MySQL 保留字

python - 如何使用 python 的 networkx 模块从节点列表生成完全连接的子图

python - 如何转换pandas中datetime对象的格式

python - 如何使用 lambda 函数更改 pandas df 中任意列的名称?