首页 > 解决方案 > 具有多级列的 Pandas 数据框:重命名特定级别的列,使其与另一个级别相同

问题描述

对不起,看似混乱的标题。我正在使用 Pandas 读取 Excel 数据。但是,原始 Excel 数据具有多行标题,并且一些单元格被合并。它看起来像这样:

擅长

它像这样在我的 Jupyter Notebook 中显示

有1

我的计划是将第 2 级作为我的列名并删除第 0 级。但是原始数据有大约 15 列显示为“未命名...”,我想知道是否可以在删除 level0 列名之前重命名这些列。

理想的输出如下所示:

输出

我可能会反复这样做,所以我没有先将其保存为 CSV,然后在 Pandas 中读取。现在,我在修复列名上花费的时间比我愿意承认的要长。我想知道是否有一种方法可以使用函数而不是重命名每个感兴趣的列。

谢谢。

标签: pythonpandasrename

解决方案


我认为这里最简单的是使用列表理解 -MultiIndex仅在没有Unnamed文本时获取值:

df.columns = [first if 'Unnamed' in second else second for first, second in df.columns]
print (df)
   Purchase/sell_time  Quantity  Price Side
0 2020-04-09 15:22:00        20     43    B
1 2020-04-09 16:22:00        30     56    S

但是,如果实际数据中可能存在更多级别,则应复制某些列,因此无法选择它们(如果按复制列选择,则获取所有列,而不仅仅是一个列,例如 by df['dup_column_name'])。

你可以测试它:

print (df.columns[df.columns.duplicated(keep=False)])

然后我建议加入所有未命名的级别以防止它:

df.columns = ['_'.join(y for y in x if 'Unnamed' not in y) for x in df.columns]
print (df)
   Purchase/sell_time  Purchase/sell_time_Quantity  Purchase/sell_time_Price  \
0 2020-04-09 15:22:00                           20                        43   
1 2020-04-09 16:22:00                           30                        56   

  Side  
0    B  
1    S  

推荐阅读