Pandas如何将混合普通/元组扁平索引转换为下划线分隔简单列名
Pandas混合类型索引转下划线分隔列名实现
目标
将同时包含普通单值、元组形式多层值的pd.Index对象,统一转换为下划线分隔格式的简单字符串列名。
- 待处理索引定义:
import pandas as pd index = pd.Index([ 'id', 'gender', 'age', ('var', 'mask', 3), ('var', 'mask', 4), ('var', 'mask', 1), ])
- 期望转换结果:
['id', 'gender', 'age', 'var_mask_3', 'var_mask_4', 'var_mask_1']
原有写法的问题
- 写法
[ '_'.join(str(x)) for x in index ]:对每个索引项整体转字符串后再执行join,join会逐字符遍历字符串拼接,最终得到单字符间插下划线的错误结果。 - 写法
[ '_'.join(x) for x in index ]:存在两个问题,一是单值字符串传入join会被拆分为单个字符拼接,二是元组内包含整数类型值,join仅支持字符串类型元素拼接,会触发TypeError: sequence item 2: expected str instance, int found报错。
正确实现
核心逻辑:遍历索引项时先判断类型,若为元组则先将元组内所有元素转为字符串,再用下划线拼接;若为单值则直接保留。
列表推导写法
converted_index = [ '_'.join(map(str, item)) if isinstance(item, tuple) else item for item in index ]
Pandas向量化写法
converted_index = index.map( lambda x: '_'.join(map(str, x)) if isinstance(x, tuple) else x ).tolist()
两种写法执行后都能得到预期结果。
内容的提问来源于stack exchange,提问作者jpetot
相关产品推荐
相关产品推荐

