python - 具有多级列的 Pandas 数据框:重命名特定级别的列,使其与另一个级别相同
问题描述
对不起,看似混乱的标题。我正在使用 Pandas 读取 Excel 数据。但是,原始 Excel 数据具有多行标题,并且一些单元格被合并。它看起来像这样:
它像这样在我的 Jupyter Notebook 中显示
我的计划是将第 2 级作为我的列名并删除第 0 级。但是原始数据有大约 15 列显示为“未命名...”,我想知道是否可以在删除 level0 列名之前重命名这些列。
理想的输出如下所示:
我可能会反复这样做,所以我没有先将其保存为 CSV,然后在 Pandas 中读取。现在,我在修复列名上花费的时间比我愿意承认的要长。我想知道是否有一种方法可以使用函数而不是重命名每个感兴趣的列。
谢谢。
解决方案
我认为这里最简单的是使用列表理解 -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
推荐阅读
- python - 根据单元格值重命名数据框列
- python - python aiohttp socketio中是否可能存在竞争条件?
- reactjs - 对象作为 React 子对象无效(将对象转换为字符串)
- ios - 如何修复“颤振:DatabaseException(open_failed ...)”?
- python - hog 特征输出数组返回很少的值
- javascript - 如何使 JavaScript 单选按钮在新窗口中打开?
- ios - Database.database().reference() 为零
- swift - 从 ARKit 3 中的 3D Skeleton 检索骨骼旋转
- javascript - 无法将属性“max-content”添加到 @key-frames
- android - 写入存储打开失败时出错:android中的ENOENT(没有这样的文件或目录)