
本文详细介绍了如何在pandas dataframe中,为每个分组内的记录计算其所有前序数据的累积中位数。通过结合 `groupby.transform`、`shift` 和 `expanding.median` 方法,可以高效且优雅地解决这一常见的数据处理需求,特别适用于需要基于历史数据进行分析的场景。
在数据分析中,我们经常会遇到需要基于历史数据进行计算的场景。例如,在一个按ID分组的有序数据集中,我们可能需要计算每个ID下,当前行之前所有“Amount”值的累积中位数。这要求我们不仅要考虑分组,还要考虑数据的时间或顺序性,并且只使用当前行之前的数据。
假设我们有一个Pandas DataFrame,其中包含 Index、ID 和 Amount 列,并且数据是按 Index 有序排列的:
Index ID Amount 0 1 A 10 1 2 A 15 2 3 A 17 3 4 A 12 4 5 A 10 5 6 B 20 6 7 B 15
我们的目标是添加一个新列 MedianOfPastElements,该列的值表示相同 ID 下,当前行之前所有 Amount 值的累积中位数。例如:
期望的输出结果如下:
Index ID Amount MedianOfPastElements 0 1 A 10 NaN 1 2 A 15 10.0 2 3 A 17 12.5 3 4 A 12 15.0 4 5 A 10 13.5 5 6 B 20 NaN 6 7 B 15 20.0
Pandas提供了一套强大且灵活的工具来处理这类分组和窗口操作。解决此问题的关键在于结合使用 groupby.transform、shift 和 expanding.median。
import pandas as pd
import numpy as np
# 示例数据
data = {
'Index': [1, 2, 3, 4, 5, 6, 7],
'ID': ['A', 'A', 'A', 'A', 'A', 'B', 'B'],
'Amount': [10, 15, 17, 12, 10, 20, 15]
}
df = pd.DataFrame(data)
# 计算前序元素的累积中位数
df['MedianOfPastElements'] = (df.groupby('ID')['Amount']
.transform(lambda s: s.shift().expanding().median())
)
print(df)让我们逐步分解这段代码,理解它是如何实现所需功能的:
df.groupby('ID')['Amount']:
.transform(lambda s: ...):
s.shift():
.expanding():
.median():
运行上述代码,将得到以下输出:
Index ID Amount MedianOfPastElements 0 1 A 10 NaN 1 2 A 15 10.0 2 3 A 17 12.5 3 4 A 12 15.0 4 5 A 10 13.5 5 6 B 20 NaN 6 7 B 15 20.0
可以看到,MedianOfPastElements 列准确地反映了每个ID分组内,当前行之前 Amount 值的累积中位数。对于每个分组的第一行,由于 shift() 操作导致其值为 NaN,因此累积中位数也为 NaN,这符合预期。
通过巧妙地结合 groupby.transform、shift 和 expanding.median,Pandas提供了一种简洁而强大的方式来解决分组内前序数据累积统计的复杂问题。掌握这种模式对于进行高级数据分析和特征工程至关重要,能够帮助我们从有序数据中提取有价值的历史信息。
以上就是Pandas:高效计算分组内前序数据的累积中位数的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号