pandas中groupby和shift结合实现相邻行的计算

简介: pandas中groupby和shift结合实现相邻行的计算

⭐️ pandas中的groupby和shift

在 Pandas 中,groupby 操作通常用于按某个列或多个列分组,然后对每个组应用某些聚合、变换或过滤操作。shift 方法用于对数据进行移位操作,它将数据沿某个轴(通常是行)进行平移。

将 groupby 和 shift 结合使用,可以对分组后的数据进行移位操作。这在需要计算组内变化或生成滞后变量(如时间序列数据中的滞后值)时非常有用。

这里给出一个示例,实现相邻两行中时间的计算。

⭐️ 准备数据

这里准备两个方法,一个方法随机生成一些时间,

def generate_random_times(start_time, end_time, num_times):
    """
    生成指定数量的随机时间,精确到秒。
    
    参数:
    start_time: datetime, 起始时间
    end_time: datetime, 结束时间
    num_times: int, 生成时间的数量
    
    返回:
    list of datetime, 随机生成的时间列表
    """
    delta = end_time - start_time
    random_times = []
    
    for _ in range(num_times):
        random_second = random.randint(0, int(delta.total_seconds()))
        random_time = start_time + timedelta(seconds=random_second)
        random_times.append(random_time)
    
    return random_times

另一个方法随机选取每行数据的组别

def generate_random_groups(num_groups=N):
    group_list = ["A", "B", "C"]
    # 随机选择多个值,允许重复
    _groups = [random.choice(group_list) for _ in range(num_groups)]
    return _groups

⭐️ 完整代码

完整代码如下

import random
import pandas as pd
from datetime import datetime, timedelta
# 数据量
N = 20
def generate_random_times(start_time, end_time, num_times):
    """
    生成指定数量的随机时间,精确到秒。
    
    参数:
    start_time: datetime, 起始时间
    end_time: datetime, 结束时间
    num_times: int, 生成时间的数量
    
    返回:
    list of datetime, 随机生成的时间列表
    """
    delta = end_time - start_time
    random_times = []
    
    for _ in range(num_times):
        random_second = random.randint(0, int(delta.total_seconds()))
        random_time = start_time + timedelta(seconds=random_second)
        random_times.append(random_time)
    
    return random_times
def generate_random_groups(num_groups=N):
    group_list = ["A", "B", "C"]
    # 随机选择多个值,允许重复
    _groups = [random.choice(group_list) for _ in range(num_groups)]
    return _groups
# 时间
start_time = datetime(2024, 1, 1, 0, 0, 0)
end_time = datetime(2024, 12, 31, 23, 59, 59)
random_times = generate_random_times(start_time, end_time, N)
# 组别
random_groups = generate_random_groups()
# 创建示例数据
data = {
    'group': random_groups,
    'date': random_times
}
df = pd.DataFrame(data)
# 按组别和时间排序,并重置索引
sorted_df = df.sort_values(by=['group', 'date']).reset_index(drop=True)
# 按 'group' 列进行分组,然后对每个组的时间进行移位
sorted_df['shifted_date'] = sorted_df.groupby('group')['date'].shift(1)
# 删除缺失值,并重置索引
result_df = sorted_df.dropna().reindex()
# 计算相连两行的时间间隔
result_df['lag'] = pd.to_datetime(result_df['date']) - pd.to_datetime(result_df['shifted_date'])
result_df['lag_seconds'] = result_df['lag'].dt.total_seconds()
result_df = result_df.reset_index(drop=True)
# 输出结果
print(result_df)

运行结果如下,由于时间和组别都存在随机因素,所以每次执行结果会不同

笔者水平有限,若有不对的地方欢迎评论指正!

相关文章
|
3月前
|
Serverless 数据处理 索引
Pandas中的shift函数:轻松实现数据的前后移动
Pandas中的shift函数:轻松实现数据的前后移动
271 0
|
3月前
|
数据挖掘 Python
pandas中的groupby函数应用
pandas中的groupby函数应用
25 0
pandas中的groupby函数应用
|
3月前
|
索引 Python
使用 pandas 对数据进行移动计算
使用 pandas 对数据进行移动计算
27 0
|
3月前
|
数据挖掘 数据处理 Python
Pandas中groupby后的数据排序技巧
Pandas中groupby后的数据排序技巧
200 0
|
3月前
|
Python
Pandas:transform计算滚动平均
Pandas:transform计算滚动平均
35 0
|
4月前
|
SQL 数据挖掘 数据处理
不再纠结,一文详解pandas中的map、apply、applymap、groupby、agg...
不再纠结,一文详解pandas中的map、apply、applymap、groupby、agg...
|
5月前
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
|
7月前
|
数据可视化 Python
如何在Pandas中对数据集进行多级分组并进行聚合计算?
在Pandas中进行多级分组与聚合计算的步骤包括导入库(如pandas和matplotlib),准备数据集,使用`groupby()`方法分组,应用聚合函数(如`sum()`、`mean()`)及可视化结果。
89 11
|
Python
【Python】【Pandas】将符合条件行的某列数值改为负数
在此顺便记录几个常用代码写法: 1.不重复取出一列的值data[列名].unique()或者data[列名].value_counts(sort=False) 2.对取出的列值进行格式处理
177 0
|
7月前
|
索引 Python
pandas读取某列、某行数据——loc、iloc用法总结
pandas读取某列、某行数据——loc、iloc用法总结
862 2