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

求助:Pandas高效处理编码字符串列的最优方案(非拆分)

问题背景

我的DataFrame中有一列以字符串形式编码的数据:

id             data
0  a   2;0;4208;1;790
1  b     2;0;768;1;47
2  c       2;0;92;1;6
3  d          1;0;341
4  e  3;0;1;2;6;4;132
5  f  3;0;1;1;6;3;492

这些数据代表系统中各类事件的发生次数,我们共有256种不同事件(事件ID范围为0-255)。由于一个统计周期内通常只有少数事件发生,存储全零数据没有意义,因此采用如下编码方式:第一个数字表示统计周期内发生的事件数量,后续每一对数字分别为事件ID和对应发生次数。

例如:
"3;0;1;1;6;3;492" 代表:

  • 统计周期内共发生3种事件
  • ID为0的事件发生1次
  • ID为1的事件发生6次
  • ID为3的事件发生492次
  • 其余事件未发生

我需要将这些数据解码为单独的列,预期结果如下:

id  data_0  data_1  data_2  data_3  data_4
0  a  4208.0   790.0     0.0     0.0     0.0
1  b   768.0    47.0     0.0     0.0     0.0
2  c    92.0     6.0     0.0     0.0     0.0
3  d   341.0     0.0     0.0     0.0     0.0
4  e     1.0     0.0     6.0     0.0   132.0
5  f     1.0     6.0     0.0   492.0     0.0

问题详情

我编写了如下函数实现解码:

def split_data(data: pd.Series):
    tmp = data.str.split(';', expand=True).astype('Int32').fillna(-1)
    tmp = tmp.apply(
        lambda row: {'{0}_{1}'.format(data.name,row[i*2-1]): row[i*2] for i in range(1,row[0]+1)},
        axis='columns',
        result_type='expand').fillna(0)
    return tmp

df = pd.concat([df, split_data(df.pop('data'))], axis=1)

但我需要处理数百万行数据,该函数执行耗时极长。由于我使用Pandas的经验有限,希望得到更高效的实现方案。

补充:方案性能测试分析

我选取了三个方案进行性能测试,测试初始条件为已存在目标DataFrame:

测试结果显示所有方案均远快于我的实现:

15行数据,重复测试1000次:

  • 我的代码:0.5827s
  • Schalton的代码:0.1138s
  • Shubham的代码:0.2242s
  • SomeDudes的代码:0.2219s

此时Schalton的方案表现最优。

但测试1500行数据,重复50次时:

  • 我的代码:31.1139s
  • Schalton的代码:2.4599s
  • Shubham的代码:0.511s
  • SomeDudes的代码:17.15s

进一步测试150000行数据,单次测试:

  • 我的代码:68.6798s
  • Schalton的代码:6.3889s
  • Shubham的代码:0.9520s
  • SomeDudes的代码:37.8837s

有趣的是,随着DataFrame规模增大,除Shubham的方案外,其余方案耗时显著增加。这是因为Schalton的方案需要将DataFrame转换为字典,转换过程会随数据量增大耗时增加,而Shubham的方案耗时几乎不受数据规模影响。

150000行数据,重复测试30次:

  • Schalton的代码:170.1538s
  • Shubham的代码:36.32s

但15行数据,重复测试30000次时:

  • Schalton的代码:50.4997s
  • Shubham的代码:74.0916s

总结

最终选择Schalton还是Shubham的方案取决于使用场景:

  • 若处理大量小型DataFrame(或初始数据为字典),选择Schalton的方案
  • 若处理超大型DataFrame,选择Shubham的方案

由于我的数据规模在百万行及以上,因此我将采用Shubham的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:01:07