当前位置:   article > 正文

pandas中groupby和shift结合实现相邻行的计算_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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
'
运行

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

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

⭐️ 完整代码

完整代码如下

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
'
运行

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

在这里插入图片描述

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/945396
推荐阅读
相关标签
  

闽ICP备14008679号