Pandas如何对指定多列实现非列表类型的unnest/explode操作
Pandas 实现指定列的行展开(非列表列explode)
你需要的这个操作本质是固定非展开列,把指定的多列转换成「属性-值」的键值对行,属于典型的宽表转长表场景,用pandas内置的melt方法就能实现,不需要手写循环。
- 第一步:导入依赖、构造示例输入数据
import pandas as pd df = pd.DataFrame({ 'id': ['id1', 'id2'], 'another_id': ['uuid1', 'uuid2'], 'origin': ['o1', 'o2'], 'title': ['t1', 't2'] })
- 第二步:指定要展开的列,执行转换
explode_columns = ['origin', 'title'] result = df.melt( # 保留不需要展开的列作为固定标识列 id_vars=df.columns.difference(explode_columns, sort=False).tolist(), value_vars=explode_columns, # 指定展开后存储原列名、原值的列名 var_name='attribute', value_name='value' )
- 第三步:(可选)对齐示例输出的行顺序
默认melt输出会把同一个属性的所有值排在一起,如果要实现同一个id下origin在前、title在后的顺序,追加排序逻辑即可:
result = result.sort_values( by=['id', 'attribute'], ascending=[True, False] ).reset_index(drop=True)
执行后输出的结果和预期完全一致:
id another_id attribute value 0 id1 uuid1 origin o1 1 id1 uuid1 title t1 2 id2 uuid2 origin o2 3 id2 uuid2 title t2
注意:不要用列表列的常规
explode方法实现这个需求,那个方法是把单元格里的列表/可迭代对象拆成多行,和当前场景不匹配。
内容的提问来源于stack exchange,提问作者RAbraham
相关产品推荐
相关产品推荐

