遍历多层表头pandas DataFrame时,如何按列名直接获取行值?
解决多层表头DataFrame遍历行取值的冗余输出问题
当使用pandas的多层表头(MultiIndex列)DataFrame时,通过iterrows()遍历行并仅指定上层列名取值,会返回包含下层表头信息的Series对象,输出带有冗余内容。示例如下:
import pandas as pd # 创建多层表头DataFrame df = pd.DataFrame(columns=[['header1_column1', 'header1_column2'], ['header2_column1', 'header2_column2']]) df['header1_column1'] = range(2) df['header1_column2'] = range(2) # 遍历行取值,输出冗余内容 for index, row in df.iterrows(): print(row['header1_column1'])
输出:
header2_column1 0 Name: 0, dtype: int64 header2_column1 1 Name: 1, dtype: int64
我们需要消除这些冗余,得到和单层表头场景一致的简洁输出(仅打印数值),以下是几种可行方案:
方法1:指定完整的多层列名元组
多层表头的列属于MultiIndex类型,每个列对应一个包含各层级名称的元组。直接使用完整元组取值,即可拿到单个标量值:
for index, row in df.iterrows(): print(row[('header1_column1', 'header2_column1')])
输出:
0 1
方法2:从返回的Series中提取标量值
仅指定上层列名时,返回的是单元素Series,可通过.iloc[0]或.values[0]提取其中的标量值:
for index, row in df.iterrows(): # 方式1:使用iloc[0] print(row['header1_column1'].iloc[0]) # 方式2:使用values[0] # print(row['header1_column1'].values[0])
输出:
0 1
方法3:扁平化多层表头
如果后续不需要保留多层表头结构,可提前将各层级名称合并为单层表头,之后即可按普通单层表头的方式操作:
# 将多层表头用下划线连接,转为单层表头 df.columns = df.columns.map('_'.join) # 使用合并后的列名取值 for index, row in df.iterrows(): print(row['header1_column1_header2_column1'])
输出:
0 1
内容的提问来源于stack exchange,提问作者AKG
相关产品推荐
相关产品推荐

