Pandas实现:将匹配的ASIN值替换为对应行索引(大数据量优化)
高效处理大规模Pandas DataFrame的ASIN替换方案
核心思路
针对超大数据集,必须优先用矢量化操作和Pandas内置的高效方法,绝对不能逐行循环,不然效率会低到离谱。
具体操作步骤
先明确目标:把ASIN为B0036FO6SI的行,asin值改成它的index(也就是1),同时把also_viewed、buy_after_viewing列里出现的这个ASIN全换成1。
定位目标ASIN的行索引
如果不知道目标ASIN在哪一行,用这行快速查询(数据集里ASIN不重复的话,这个操作效率很高):target_asin = 'B0036FO6SI' target_idx = df[df['asin'] == target_asin].index[0]修改目标行的asin值
直接通过索引定位修改,不用扫描全表:df.loc[target_idx, 'asin'] = target_idx处理also_viewed列(列表类型)
这个列存的是列表,用apply结合列表推导式替换,比逐行循环快得多:df['also_viewed'] = df['also_viewed'].apply( lambda x: [target_idx if item == target_asin else item for item in x] if isinstance(x, list) else x )如果数据集特别大,还可以试试批量替换技巧:先把列表转成字符串,替换完再转回列表(前提是列表元素里没有逗号):
df['also_viewed'] = df['also_viewed'].astype(str).replace(target_asin, str(target_idx)).apply(eval)处理buy_after_viewing列
这个列是单一值或者NaN,直接用replace方法,矢量化操作效率拉满:df['buy_after_viewing'] = df['buy_after_viewing'].replace(target_asin, target_idx)
优化小贴士
- 如果是千万级别的超大数据集,内存不够的话,可以用Dask DataFrame做并行处理
- 提前把
asin列转成category类型,能大幅加快等值查询的速度
处理后结果示例
| index | asin | salesRank | categories | also_viewed | buy_after_viewing | also_bought |
|---|---|---|---|---|---|---|
| 0 | 0001048791 | {'Books': 6334800} | [['Books']] | [1, B000KL8ODE] | 1 | 0000032050 |
| 1 | 1 | {'Movies & TV': 376041} | [['Movies & TV', 'Movies']] | NaN | NaN | NaN |
内容的提问来源于stack exchange,提问作者joaco gomez
相关产品推荐
相关产品推荐

