如何计算Pandas DataFrame中两行数据的增长率(百分比)
计算不同时期用户增长率的Pandas解决方案
处理步骤
核心思路是先把数据转换为宽格式,让每个来源的当前值和历史值在同一行,再计算增长率,最后整理成目标格式。
- 构造示例数据(已有DataFrame可跳过)
import pandas as pd import numpy as np data = { 'sessionSource': ['instagram.com', 'instagram.com', 'l.instagram.com', 'l.instagram.com', 'snapchat.com', 'snapchat.com'], 'dateRange': ['current', 'previous', 'current', 'previous', 'current', 'previous'], 'activeUsers': [5, 0, 83, 11, 2, 1] } df = pd.DataFrame(data)
- 转换为宽格式
将每个sessionSource的current和previous值放在同一行,便于计算:
wide_df = df.pivot(index='sessionSource', columns='dateRange', values='activeUsers').reset_index()
- 计算增长率
使用公式(当前值-历史值)/历史值 * 100,同时处理历史值为0的情况(避免除以0错误):
# 历史值为0时返回'N/A',可根据需求自定义内容 wide_df['Growth'] = np.where( wide_df['previous'] == 0, 'N/A', round((wide_df['current'] - wide_df['previous']) / wide_df['previous'] * 100, 2).astype(str) + '%' )
- 整理成目标格式
筛选当前时期的数据,调整列顺序和名称:
result_df = wide_df[['sessionSource', 'current']].rename(columns={'current': 'activeUsers'}) result_df['dateRange'] = 'current' result_df['Growth'] = wide_df['Growth'] # 调整列顺序匹配需求 result_df = result_df[['sessionSource', 'dateRange', 'activeUsers', 'Growth']].reset_index(drop=True)
最终结果
运行后result_df的输出为:
sessionSource dateRange activeUsers Growth 0 instagram.com current 5 N/A 1 l.instagram.com current 83 654.55% 2 snapchat.com current 2 100.00%
自定义调整
- 若需修改增长率的小数位数,调整
round函数的第二个参数即可 - 若历史值为0时需要显示其他内容(比如'无历史数据'),替换
np.where中的'N/A'即可
内容的提问来源于stack exchange,提问作者Omar
相关产品推荐
相关产品推荐

