
本文详细介绍了如何在pandas dataframe中,为每个分组(如按id)计算其前序(即之前所有行)元素的累积中位数。通过结合使用`groupby().transform()`、`shift()`和`expanding().median()`,我们可以高效地实现这一复杂的数据转换,生成一个新列来存储每个分组内过去数据的中位数。
在数据分析和处理中,我们经常需要对数据进行分组统计。有时,这种统计并非针对整个分组,而是针对分组内当前行之前的历史数据。例如,在处理时间序列数据或按特定ID分组的数据时,可能需要计算某个指标在当前时刻之前所有值的累积中位数。Pandas库提供了强大的工具集来应对此类挑战。
假设我们有一个有序的Pandas DataFrame,其中包含ID和Amount两列。我们的目标是创建一个新列MedianOfPastElements,该列的每个值应是当前行所属ID分组中,所有先于当前行的Amount值的累积中位数。
以下是原始DataFrame的示例结构:
Index ID Amount 1 A 10 2 A 15 3 A 17 4 A 12 5 A 10 6 B 20 7 B 15 ...
我们期望的输出结果如下,其中MedianOfPastElements列包含了所需的分组内前序元素的累积中位数:
Index ID Amount MedianOfPastElements 1 A 10 NaN 2 A 15 10.0 3 A 17 12.5 4 A 12 15.0 5 A 10 13.5 6 B 20 NaN 7 B 15 20.0 ...
请注意,对于每个ID分组的第一个元素,由于没有前序数据,其MedianOfPastElements应为NaN。
Pandas提供了一种优雅且高效的方法来实现这一需求,即组合使用groupby().transform()、shift()和expanding().median()。
让我们通过一个具体的例子来演示这个解决方案。
import pandas as pd
import numpy as np
# 创建示例DataFrame
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)
print("原始DataFrame:")
print(df)
# 计算分组内前序元素的累积中位数
df['MedianOfPastElements'] = (
df.groupby('ID')['Amount']
.transform(lambda s: s.shift().expanding().median())
)
print("\n结果DataFrame:")
print(df)代码输出:
原始DataFrame: 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 结果DataFrame: 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中处理分组内前序元素的累积统计需求,这在金融分析、时间序列建模等领域具有广泛的应用价值。
以上就是Pandas:高效计算分组内前序元素的累积中位数的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号