1、创建数据透视表
使用pivot_table
方法可以创建数据透视表。这个方法非常灵活,允许指定不同的聚合函数、行列索引和值。
参考文档:Python pandas.DataFrame.pivot_table函数方法的使用
数据根据日期和类型进行了汇总,并计算了每个日期和类型组合的值总和。如下,
import pandas as pd
# 示例数据
data = {
'Date': ['2020-01-01', '2020-01-01', '2020-01-02', '2020-01-02'],
'Type': ['A', 'B', 'A', 'B'],
'Value': [10, 15, 5, 7]
}
df = pd.DataFrame(data)
# 创建数据透视表
pivot = pd.pivot_table(df, values='Value', index='Date', columns='Type', aggfunc='sum')
print(pivot)
2、自定义聚合函数
可以使用自定义函数来执行更复杂的聚合操作。通常通过 groupby 方法结合 apply 函数来实现。apply 函数可以对分组数据应用任意函数,从而实现灵活的数据处理。
需要定义一个自定义函数,该函数将对分组的数据进行操作。这个函数可以执行任何计算,从简单的数学运算到复杂的逻辑。可以使用 groupby 方法对数据进行分组,并使用 apply 方法应用自定义函数。
参考文档:
Python pandas.DataFrame.pivot_table函数方法的使用
Python pandas.DataFrame.groupby函数方法的使用
Python pandas.DataFrame.apply函数方法的使用
1)聚合操作
import pandas as pd
# 定义一个自定义函数计算范围(最大值 - 最小值)
def range_function(x):
return x.max() - x.min()
# 创建一个示例 DataFrame
df = pd.DataFrame({
'Category': ['A', 'A', 'B', 'B', 'C', 'C'],
'Values': [10, 20, 15, 25, 30, 40]
})
# 使用 groupby 和 apply
result = df.groupby('Category')['Values'].apply(range_function)
# 输出结果
print(result)
2)数据透视表聚合操作
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
df = pd.DataFrame({
'Category': ['A', 'A', 'B', 'B', 'C', 'C'],
'Subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
'Values': [10, 20, 15, 25, 30, 40]
})
# 定义一个自定义聚合函数
def custom_agg(x):
# 计算平均值,但排除 NaN 值,并考虑空值
if len(x) == 0:
return np.nan
return np.nanmean(x)
# 创建数据透视表,使用自定义聚合函数
pivot_table_custom_agg = df.pivot_table(
values='Values',
index='Category',
columns='Subcategory',
aggfunc=custom_agg # 应用自定义聚合函数
)
# 输出结果
print(pivot_table_custom_agg)
3、多个聚合函数
可以使用 groupby
方法对数据进行分组,并使用 agg 方法应用多个聚合函数。
参考文档:
Python pandas.DataFrame.pivot_table函数方法的使用
Python pandas.DataFrame.groupby函数方法的使用
Python pandas.DataFrame.agg函数方法的使用
1)多个聚合函数
import pandas as pd
# 创建一个示例 DataFrame
df = pd.DataFrame({
'Category': ['A', 'A', 'B', 'B', 'C', 'C'],
'Values': [10, 20, 15, 25, 30, 40],
'Scores': [80, 90, 70, 60, 50, 40]
})
# 使用 groupby 和 agg 应用多个聚合函数
result = df.groupby('Category').agg({
'Values': ['mean', 'sum', 'max'],
'Scores': ['min', 'std']
})
# 输出结果
print(result)
2)数据透视表多个聚合函数
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
df = pd.DataFrame({
'Category': ['A', 'A', 'B', 'B', 'C', 'C'],
'Subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
'Values': [10, 20, 15, 25, 30, 40]
})
# 在数据透视表中应用多个聚合函数
pivot_table_multiple_agg = df.pivot_table(
values='Values',
index='Category',
columns='Subcategory',
aggfunc=[np.mean, np.sum, np.max] # 应用多个聚合函数
)
# 输出结果
print(pivot_table_multiple_agg)
4、填充缺失值
在创建数据透视表时,可以指定用来填充缺失值的值。
参考文档:Python pandas.DataFrame.pivot_table函数方法的使用
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame,包含一些缺失值
df = pd.DataFrame({
'Category': ['A', 'A', 'B', 'B', 'C', 'C'],
'Subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
'Values': [10, np.nan, 15, 25, np.nan, 40]
})
# 创建数据透视表
pivot_table = df.pivot_table(
values='Values',
index='Category',
columns='Subcategory',
aggfunc=np.sum
)
# 填充缺失值
pivot_table_filled = pivot_table.fillna(0)
# 输出结果
print(pivot_table_filled)
5、添加小计
在创建数据透视表时,可以使用margins=True
添加小计。
参考文档:Python pandas.DataFrame.pivot_table函数方法的使用
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
df = pd.DataFrame({
'Category': ['A', 'A', 'B', 'B', 'C', 'C'],
'Subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
'Values': [10, 20, 15, 25, 30, 40]
})
# 在数据透视表中添加小计(margins)
pivot_table_with_margins = df.pivot_table(
values='Values',
index='Category',
columns='Subcategory',
aggfunc=np.sum,
margins=True, # 添加小计
margins_name='Total' # 小计的名称
)
# 输出结果
print(pivot_table_with_margins)
6、多索引和多值
数据透视表还支持使用多个索引和/或聚合多个值列。
import pandas as pd
import numpy as np
# 创建一个包含多索引和多值的示例 DataFrame
df_multi = pd.DataFrame({
'Category': ['A', 'A', 'B', 'B', 'C', 'C'],
'Subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
'Region': ['East', 'West', 'East', 'West', 'East', 'West'],
'Values': [10, 20, 15, 25, 30, 40],
'Scores': [80, 90, 70, 60, 50, 40]
})
# 创建数据透视表,使用多索引和多值
pivot_table_multi_index = df_multi.pivot_table(
values=['Values', 'Scores'],
index=['Category', 'Subcategory'],
columns='Region',
aggfunc=np.mean
)
# 输出结果
print(pivot_table_multi_index)