Pandas中Day列无法重命名求助:是否因该列为索引所致?
问题原因及解决方法
你的猜测完全正确:"Day"是DataFrame的多级索引成员,而非普通列,所以df.rename(columns=...)无法修改它的名称——这个方法只作用于列,不作用于索引。
解决方法
方法1:将索引转为列后重命名(适合需要把Day作为普通列的场景)
先把索引转换为普通列,重命名后可选择是否重新设置为索引:
import pandas as pd import numpy as np # Load the excel file into a dataframe df = pd.read_excel("Marginal CPA data - NOV.xlsx") # Delete the bottom row df = df[:-1] # Filter the column labeled "Campaign Type (Search ACQ) - ONC" to keep only rows with value "NonBrand" df = df[df["Campaign Type (Search ACQ) - ONC"] == "NonBrand"] # Make a pivot table pivot_table = pd.pivot_table(df, values=["Media Cost", "CAFE Approvals"], index=["Campaign Type (Search ACQ) - ONC", "Product (ACQ Search) - ONC", "Day"], columns=["CDJ"], aggfunc="sum") df_pivot = pivot_table.fillna(value=0) # Reset the column index to a single level df_pivot.columns = ["_".join(col) for col in df_pivot.columns] # 重置索引,将多级索引转为普通列 df_pivot = df_pivot.reset_index() # 现在可以正常重命名Day列为Date df_pivot = df_pivot.rename(columns={"Media Cost_CPA": "CPA Spend", "Media Cost_Non CPA (CDJ)": "CDJ Spend", "CAFE Approvals_CPA": "CPA Approvals", "CAFE Approvals_Non CPA (CDJ)": "CDJ Approvals", "Day": "Date"}) # (可选)如果需要将Date重新设为索引,执行以下代码 # df_pivot = df_pivot.set_index(["Campaign Type (Search ACQ) - ONC", "Product (ACQ Search) - ONC", "Date"])
方法2:直接重命名索引级别(适合保持Day为索引的场景)
无需转换列,直接修改索引的级别名称,更高效:
import pandas as pd import numpy as np # Load the excel file into a dataframe df = pd.read_excel("Marginal CPA data - NOV.xlsx") # Delete the bottom row df = df[:-1] # Filter the column labeled "Campaign Type (Search ACQ) - ONC" to keep only rows with value "NonBrand" df = df[df["Campaign Type (Search ACQ) - ONC"] == "NonBrand"] # Make a pivot table pivot_table = pd.pivot_table(df, values=["Media Cost", "CAFE Approvals"], index=["Campaign Type (Search ACQ) - ONC", "Product (ACQ Search) - ONC", "Day"], columns=["CDJ"], aggfunc="sum") df_pivot = pivot_table.fillna(value=0) # Reset the column index to a single level df_pivot.columns = ["_".join(col) for col in df_pivot.columns] # 重命名列 df_pivot = df_pivot.rename(columns={"Media Cost_CPA": "CPA Spend", "Media Cost_Non CPA (CDJ)": "CDJ Spend", "CAFE Approvals_CPA": "CPA Approvals", "CAFE Approvals_Non CPA (CDJ)": "CDJ Approvals"}) # 直接修改索引的第三个级别名称(索引从0开始,Day是第3个级别) df_pivot.index.names = ["Campaign Type (Search ACQ) - ONC", "Product (ACQ Search) - ONC", "Date"]
未处理数据样本
| Campaign Type (Search ACQ) - ONC | Product (ACQ Search) - ONC | CDJ | Day | Media Cost | CAFE Approvals |
|---|---|---|---|---|---|
| NonBrand | Consumer | CPA | 11 Jan 2023 | 29019.77415 | 94 |
| NonBrand | Consumer | Non CPA (CDJ) | 17 Jan 2023 | 24640.36448 | 86 |
| NonBrand | Consumer | Non CPA (CDJ) | 12 Jan 2023 | 23627.78256 | 78 |
| NonBrand | Student | CPA | 17 Jan 2023 | 29863.95447 | 152 |
| NonBrand | Miles | CPA | 23 Jan 2023 | 380.94 | 1 |
| NonBrand | Miles | CPA | 07 Jan 2023 | 1786.51 | 5 |
| NonBrand | Consumer | CPA | 19 Jan 2023 | 26745.81705 | 64 |
| NonBrand | Secured | CPA | 20 Jan 2023 | 1551.35 | 19 |
| NonBrand | Consumer | Non CPA (CDJ) | 02 Feb 2023 | 41185.11225 | 66 |
内容的提问来源于stack exchange,提问作者jimlearnscoding
相关产品推荐
相关产品推荐

