在使用 pandas.pivot_table() 创建 df_pivot 后,可以处理 df_pivot 中的指定列,但处理方式和处理原始的 df 可能有所不同。具体的差异在于原始 DataFrame (df) 是行式的(即每一行代表一个数据点),而通过 pivot_table() 转换后的 df_pivot 通常是列式的(即对行数据进行聚合或重塑)。下面讲解如何操作这两个 DataFrame,并对比它们在处理列时的异同。
1. 基本示例:pivot_table 创建后的 df_pivot
假设有一个 DataFrame df,其中包含一些数据,通过 pivot_table 将它转换为 df_pivot。
示例:
import pandas as pd
# 原始 DataFrame
df = pd.DataFrame({
'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
'Value': [10, 20, 30, 40, 50, 60],
'Amount': [100, 200, 300, 400, 500, 600]
})
# 使用 pivot_table 聚合数据
df_pivot = df.pivot_table(values=['Value', 'Amount'], index='Category', aggfunc='sum')
print("Original DataFrame (df):\n", df)
print("\nPivot Table DataFrame (df_pivot):\n", df_pivot)
输出:
Original DataFrame (df):
Category Value Amount
0 A 10 100
1 B 20 200
2 A 30 300
3 B 40 400
4 A 50 500
5 B 60 600
Pivot Table DataFrame (df_pivot):
Value Amount
Category
A 90 900
B 120 1200
解释:
df是原始数据,df_pivot是通过pivot_table()创建的,按照Category列进行聚合,求每个类别的Value和Amount的和。df_pivot的列被聚合成了Value和Amount,并且Category作为索引。
2. 处理 df_pivot 中的指定列
你可以像普通 DataFrame 一样对 df_pivot 进行列操作,但有几个特征需要注意:
df_pivot可能包含多个列,且它的索引(如Category)是从原始 DataFrame 中提取的。- 对
df_pivot中的指定列进行处理时,通常是列的操作(例如数学计算、条件替换等)。
示例:对 df_pivot 进行列操作
假设我们需要将 df_pivot 中的 Value 和 Amount 列都乘以 10。
# 对 df_pivot 中的列进行操作(例如乘以 10)
df_pivot['Value'] = df_pivot['Value'] * 10
df_pivot['Amount'] = df_pivot['Amount'] * 10
print("\nProcessed Pivot Table (df_pivot):\n", df_pivot)
输出:
Processed Pivot Table (df_pivot):
Value Amount
Category
A 900 9000
B 1200 12000
3. 比较 df 和 df_pivot 的处理列的异同
相同点:
- 列操作:无论是
df还是df_pivot,都可以像常规 DataFrame 一样直接对列进行操作。例如,对列进行数学运算、条件修改、填充缺失值等。 - 列命名:在
df和df_pivot中,列名可以直接通过df['column_name']或df_pivot['column_name']来访问和修改。
不同点:
-
索引结构:
df是一个标准的二维数据表,每一行都有唯一的索引值(默认从 0 开始)。df_pivot的索引通常是来自于pivot_table()中的index参数(如本例中的Category),且df_pivot会按指定的索引进行行聚合。因此,df_pivot可能是分组后的数据,它的索引不再是整数,而是聚合的类别。
影响:如果要对
df_pivot进行列操作,必须小心索引,因为它们会影响如何引用或对数据进行定位。比如,不能直接像df['Value']那样在df_pivot中引用Value列,因为df_pivot的索引有可能会被用作过滤条件。 -
聚合操作的结果:
df中的每一行代表一个数据点,你对df的操作通常是逐行或逐列的计算。df_pivot中的每一行代表一个聚合后的数据点,因此,df_pivot中的列值通常是基于某些分组条件聚合的结果(例如,本例中按Category分组计算了Value和Amount的总和)。所以对df_pivot进行的操作通常是对聚合结果的操作,而不再是对单个数据点的操作。
例子:处理 df 和 df_pivot 中相同列的异同
假设我们要对 df 和 df_pivot 的 Value 列应用条件过滤操作:
对 df 进行条件操作:
# 对 df 中的 Value 列进行条件过滤(例如,保留 Value > 30)
df_filtered = df[df['Value'] > 30]
print("\nFiltered Original DataFrame (df):\n", df_filtered)
输出:
Filtered Original DataFrame (df):
Category Value Amount
2 A 30 300
4 A 50 500
5 B 60 600
对 df_pivot 进行相同的条件操作:
# 对 df_pivot 中的 Value 列进行条件过滤(例如,保留 Value > 1000)
df_pivot_filtered = df_pivot[df_pivot['Value'] > 1000]
print("\nFiltered Pivot Table (df_pivot):\n", df_pivot_filtered)
输出:
Filtered Pivot Table (df_pivot):
Value Amount
Category
B 1200 12000
解释:
- 在
df中,是按每一行的数据进行过滤操作。 - 在
df_pivot中,是对每个聚合后的结果进行过滤操作。由于df_pivot的数据是按Category聚合的,所以根据聚合后的Value列进行过滤。
总结:
df与df_pivot的列操作:在两者之间,列的处理方式类似,都可以进行常见的操作(如数学计算、条件替换等)。不过,df是原始的行数据,而df_pivot是聚合后的数据,处理时需要考虑索引和聚合的影响。- 区别:在
df_pivot中,由于数据已经被聚合,操作时通常涉及的是聚合结果,而不是原始数据。df则是逐行的数据,每一行可以独立地进行操作。