# 使用 pivot_table 方法
pivot_df = pd.pivot_table(data_9, values=['col', 'count'], index='date', columns='model_name', aggfunc='sum', fill_value=0)
new_levels = pivot_df.columns.levels[1].str.extract(r'.*(\w+).*')
new_levels = [x for x in new_levels[0]]
print(new_levels)
# pivot_df.columns.set_levels(new_levels, level=1)
pivot_df.columns = pivot_df.columns.set_levels(new_levels, level=1)
pivot_df

前言

pandas 是 Python 中一个强大的数据分析和操作库,而 pivot_tablepandas 提供的一个函数,它允许我们对数据集进行数据透视表操作,类似于 Excel 中的透视表功能。使用 pivot_table 可以对数据进行分组、聚合和重塑,以便于分析和可视化。

pivot_table基本用法

以下是 pivot_table 函数的一些基本用法:

  1. 基本语法:
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
  • data: DataFrame 对象,需要进行透视的数据。
  • values: 需要聚合的数据列
  • index: 作为行标签的数据列。
  • columns: 作为列标签的数据列。
  • aggfunc: 聚合函数,默认为 'mean',可以是字符串(如 'sum', 'mean', 'count' 等)或自定义函数。
  • fill_value: 缺失值填充值。
  • margins: 是否添加行/列总计。
  • margins_name: 行/列总计的名称。
  • 示例:
import pandas as pd

# 创建一个示例 DataFrame
data = {
    'Date': ['2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02'],
    'Category': ['A', 'B', 'A', 'B'],
    'Value': [100, 200, 150, 250]
}
df = pd.DataFrame(data)

# 创建数据透视表
pivot_table = pd.pivot_table(df, values='Value', index='Date', columns='Category', aggfunc='sum')
print(pivot_table)

输出结果:

        Value  
Category      A  B
Date     
2021-01-01  100  200
2021-01-02  150  250
3. 多级索引: 如果 indexcolumns 有多列,结果将具有多级索引。 4. 自定义聚合函数: 可以通过传递一个函数或函数列表来自定义聚合函数。 5. 添加总计: 通过设置 margins=True,可以在数据透视表中添加总计行和列。

pivot_table 是数据分析中非常有用的工具,可以帮助你快速地对数据进行多维度的汇总和分析。

set_levels基本用法

在Pandas中,set_levels 方法用于更改 MultiIndex 的某一级的值。这个方法非常有用,特别是在你需要批量修改 MultiIndex 的某一级时。然而,使用 set_levels 方法时需要注意保持索引的一致性,否则可能会遇到错误。

基本用法

set_levels 方法的基本语法如下:

df.columns = df.columns.set_levels(new_levels, level=n)
  • new_levels:新的级别值,必须是一个列表或数组,长度与原级别的长度相同。
  • level:要更改的级别编号,从0开始计数。

示例

假设我们有一个 DataFrame,其列名是一个 MultiIndex,我们希望更改第二级(level=1)的值。

示例数据

import pandas as pd

# 创建示例数据
data = {
    'Product_A_Sales': [100, 150, 200],
    'Product_B_Sales': [200, 250, 300],
    'Product_C_Sales': [300, 350, 400],
    'Product_D_Price': [10, 20, 30]
}
df = pd.DataFrame(data)

# 创建 MultiIndex
df.columns = pd.MultiIndex.from_tuples([('Product_A', 'Sales'), ('Product_B', 'Sales'), ('Product_C', 'Sales'), ('Product_D', 'Price')])

# 打印原始 MultiIndex
print("Original MultiIndex:")
print(df.columns)

输出:

Original MultiIndex:
MultiIndex([( 'Product_A', 'Sales'),
            ('Product_B', 'Sales'),
            ('Product_C', 'Sales'),
            ('Product_D', 'Price')],
           )

修改第二级

我们希望将第二级中的 'Sales' 替换为 'Revenue'

# 获取当前的第二级值
current_levels = df.columns.levels[1]

# 创建新的第二级值
new_levels = [x.replace('Sales', 'Revenue') if x == 'Sales' else x for x in current_levels]

# 使用 set_levels 方法更新第二级
df.columns = df.columns.set_levels(new_levels, level=1)

# 打印修改后的 MultiIndex
print("\nModified MultiIndex:")
print(df.columns)

输出:

Modified MultiIndex:
MultiIndex([( 'Product_A', 'Revenue'),
            ('Product_B', 'Revenue'),
            ('Product_C', 'Revenue'),
            ('Product_D', 'Price')],
           )

注意事项

  1. 确保新级别的长度与原级别相同new_levels 的长度必须与 df.columns.levels[1] 的长度相同,否则会引发错误。
  2. 保持索引的一致性:在修改 MultiIndex 的某一级时,确保索引的一致性。如果不确定,可以重新构建 MultiIndex

重新构建 MultiIndex

如果需要更复杂的修改,可以重新构建 MultiIndex,确保所有索引代码和索引值都是一致的。

# 重新构建 MultiIndex
new_columns = [(col[0], col[1].replace('Sales', 'Revenue')) for col in df.columns]
df.columns = pd.MultiIndex.from_tuples(new_columns)

# 打印修改后的 MultiIndex
print("\nRebuilt MultiIndex:")
print(df.columns)

输出:

Rebuilt MultiIndex:
MultiIndex([( 'Product_A', 'Revenue'),
            ('Product_B', 'Revenue'),
            ('Product_C', 'Revenue'),
            ('Product_D', 'Price')],
           )

总结

  • set_levels 方法:用于更改 MultiIndex 的某一级的值。确保新级别的长度与原级别相同。
  • 重新构建 MultiIndex:如果需要更复杂的修改,可以重新构建 MultiIndex,确保所有索引代码和索引值都是一致的。

希望这些示例和解释能帮助你更好地理解和使用 set_levels 方法。如果有任何其他问题,请随时提问!