You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将纵向Pandas DataFrame转为面板数据并优化大规模数据处理

解决方案

一、大规模数据下的横向面板转换

针对2000万行的大数据量,优先采用向量化操作+内存优化方案,避免内存溢出:

  1. 预处理数据,确保时间序列有序

    # 转换date为datetime类型(未转换时执行)
    df['date'] = pd.to_datetime(df['date'])
    # 按id和日期排序,保证每个id的时间序列连续
    df = df.sort_values(['id', 'date']).reset_index(drop=True)
    
  2. 生成每个id内部的时间索引t1~tn

    # 为每个id的记录生成从1开始的连续序号,对应t1、t2...tn
    df['t_col'] = df.groupby('id').cumcount() + 1
    # 过滤超过1825的记录(对应5年上限)
    df = df[df['t_col'] <= 1825]
    
  3. 转换为横向面板

    # 用pivot_table高效转换(假设每个id每天仅一条记录,aggfunc='first'保证唯一值)
    panel_df = df.pivot_table(index='id', columns='t_col', values='amount', aggfunc='first')
    # 重命名列为t1、t2...tn格式
    panel_df.columns = [f't{col}' for col in panel_df.columns]
    # 填充日期断层的缺失值(按需用0或NaN填充)
    panel_df = panel_df.fillna(0)
    

内存优化提示:若内存压力大,可将amount转换为float32等更节省内存的类型,或用dask.dataframe做分块处理。


二、连续零值统计与区间最大值计算

全部采用向量化分组操作,避免循环,适配大规模数据:

1. 计算consec_zero_count列

统计每行对应的连续零值天数(非零值行记为0):

# 标记amount为0的行
df['is_zero'] = df['amount'] == 0
# 生成连续零值的分组标识:非零值会触发分组切换
df['zero_group'] = (~df['is_zero']).cumsum()
# 计算每个分组的长度,映射到原数据
df['consec_zero_count'] = df.groupby(['id', 'zero_group'])['is_zero'].transform('count') * df['is_zero'].astype(int)

2. 计算三个区间的连续零值最大值

先提取每个id的连续零值块长度,再分别统计对应区间的最大值:

# 提取所有连续零值块的长度,按id分组
zero_blocks = df[df['is_zero']].groupby(['id', 'zero_group'])['date'].count().reset_index(name='block_len')

# 向量化区间统计逻辑
def get_interval_max(group, lower, upper):
    filtered = group[(group['block_len'] >= lower) & (group['block_len'] <= upper)]['block_len']
    return filtered.max() if not filtered.empty else 0

# 按id计算三个区间的最大值
interval_stats = zero_blocks.groupby('id').apply(
    lambda x: pd.Series({
        'max_dnp_d0_d2': get_interval_max(x, 0, 2),
        'max_dnp_d3_d5': get_interval_max(x, 3, 5),
        'max_dnp_d6_d9': get_interval_max(x, 6, 9)
    })
).reset_index()

# 将统计结果合并到横向面板
panel_df = panel_df.merge(interval_stats, on='id', how='left')
# 填充无零值id的统计结果为0
panel_df = panel_df.fillna(0)

效率优化提示:若zero_blocks数据量较大,可先用pd.cut对block_len分箱,再分组统计,进一步提升速度。


内容的提问来源于stack exchange,提问作者bunti papu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:40:28