求助: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
相关产品推荐
相关产品推荐

