# 使用 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_table
是 pandas
提供的一个函数,它允许我们对数据集进行数据透视表操作,类似于 Excel 中的透视表功能。使用 pivot_table
可以对数据进行分组、聚合和重塑,以便于分析和可视化。
pivot_table基本用法
以下是 pivot_table
函数的一些基本用法:
- 基本语法:
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. 多级索引:
如果 index
或 columns
有多列,结果将具有多级索引。
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')],
)
注意事项
- 确保新级别的长度与原级别相同:
new_levels
的长度必须与df.columns.levels[1]
的长度相同,否则会引发错误。 - 保持索引的一致性:在修改
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
方法。如果有任何其他问题,请随时提问!