Python Pandas - 透视表



在 Python Pandas 中,透视表是一种强大的数据转换技术,可以重塑数据,以便于分析和可视化。它将数据的表示形式从“长”格式更改为“宽”格式,从而简化了聚合和比较操作。此技术在处理时间序列数据或具有多个列的数据集时尤其有用。

Pandas 库提供了两种主要的透视表方法:pivot()pivot_table()。在本教程中,我们将学习如何使用 pivot() 和 pivot_table() 方法有效地操作数据。

使用 pivot() 进行透视

Pandas 的 df.pivot() 方法用于在指定索引和列对具有唯一值时重塑数据。当您的数据结构良好且索引/列组合没有重复项时,此方法非常简单且实用。

示例

这是一个使用 Pandas 的 df.pivot() 方法演示 Pandas DataFrame 透视的基本示例。

import pandas as pd

# Create a DataFrame
df = pd.DataFrame({"Col1": range(12),"Col2": ["A", "A", "A", "B", "B","B", "C", "C", "C", "D", "D", "D"],
"date": pd.to_datetime(["2024-01-03", "2024-01-04", "2024-01-05"] * 4)})

# Display the Input DataFrame
print('Original DataFrame:\n', df)

# Pivot the DataFrame
pivoted = df.pivot(index="date", columns="Col2", values="Col1")

# Display the output
print('Pivoted DataFrame:\n', pivoted)

以下是上述代码的输出 -

Original DataFrame:
Col1Col2date
00A2024-01-03
11A2024-01-04
22A2024-01-05
33B2024-01-03
44B2024-01-04
55B2024-01-05
66C2024-01-03
77C2024-01-04
88C2024-01-05
99D2024-01-03
1010D2024-01-04
1111D2024-01-05
Pivoted DataFrame:
Col2ABCD
date
2024-01-030369
2024-01-0414710
2024-01-0525811

注意pivot() 方法要求指定的索引和列具有唯一值。如果您的数据包含重复项,则应改用 pivot_table() 方法。

使用 pivot_table() 进行透视

pivot() 方法是重塑数据的一种简单方法,而 pivot_table() 提供了聚合的灵活性,使其适用于更复杂的数据操作任务。这在处理重复项并需要数据聚合时尤其有用。

示例

此示例演示了如何使用 df.pivot_table() 方法对 DataFrame 进行透视。

import numpy as np
import pandas as pd
import datetime

# Create a DataFrame
df = pd.DataFrame({"A": [1, 1, 2, 3] * 6,
"B": ["A", "B", "C"] * 8,
"C": ["x", "x", "x", "y", "y", "y"] * 4,
"D": np.random.randn(24),
"E": np.random.randn(24),
"F": [datetime.datetime(2013, i, 1) for i in range(1, 13)] +[datetime.datetime(2013, i, 15) for i in range(1, 13)]})

# Display the Input DataFrame
print('Original DataFrame:\n', df)

# Pivot the DataFrame
pivot_table = pd.pivot_table(df, values="D", index=["A", "B"], columns=["C"])

# Display the output
print('Pivoted DataFrame:\n', pivot_table)

以下是上述代码的输出 -

Original DataFrame:
A B C D E F
01Ax-0.5303952.8199762013-01-01
11Bx-0.5933470.6398772013-02-01
22Cx0.817982-0.2704992013-03-01
33Ay-1.4380481.7077902013-04-01
41By0.207012-0.3873642013-05-01
51Cy0.4625501.1452602013-06-01
62Ax3.032849-0.0278882013-07-01
73Bx-0.972964-0.5468192013-08-01
81Cx0.613289-0.0417062013-09-01
91Ay-1.072169-0.0618432013-10-01
102By1.3054000.4639812013-11-01
113Cy-1.265300-2.0201582013-12-01
121Ax0.165842-0.1541732013-01-15
131Bx-1.038789-0.7059482013-02-15
142Cx0.6906390.8438552013-03-15
153Ay-0.5922020.7182812013-04-15
161By0.048085-1.1119172013-05-15
171Cy1.111408-0.1252142013-06-15
182Ax0.0860120.2760062013-07-15
193Bx-1.043673-0.7770432013-08-15
201Cx-0.4718180.7369212013-09-15
211Ay-0.138187-0.8491342013-10-15
222By-2.286761-2.8592582013-11-15
233Cy0.392779-0.1047372013-12-15
Pivoted DataFrame: C x y A B 1 A -0.182276 -0.605178 B -0.816068 0.127548 C 0.070736 0.786979 2 A 1.559430 NaN B NaN -0.490681 C 0.754310 NaN 3 A NaN -1.015125 B -1.008318 NaN C NaN -0.436260

使用聚合进行透视

Pandas 的 pivot_table() 方法可以用来指定聚合函数。默认情况下,它计算平均值,但您也可以使用 sum、count 等函数,甚至可以使用自定义函数对透视进行聚合。

示例

此示例演示了如何使用 df.pivot_table() 方法对 DataFrame 进行透视并应用聚合函数。

import numpy as np
import datetime
import pandas as pd

# Create a DataFrame
df = pd.DataFrame({"A": [1, 1, 2, 3] * 6,
"B": ["A", "B", "C"] * 8,
"C": ["x", "x", "x", "y", "y", "y"] * 4,
"D": np.random.randn(24),
"E": np.random.randn(24),
"F": [datetime.datetime(2013, i, 1) for i in range(1, 13)] +[datetime.datetime(2013, i, 15) for i in range(1, 13)]})

# Display the Input DataFrame
print('Original DataFrame:\n', df)

# Pivot the DataFrame with a aggregate function
pivot_table = pd.pivot_table(df, values=["D", "E"], index=["B"], columns=["A", "C"], aggfunc="sum")

# Display the output
print('Pivoted DataFrame:\n', pivot_table)

以下是上述代码的输出 -

Original DataFrame:
ABCDEF
01Ax0.9217280.8077992013-01-01
11Bx0.565152-0.3699472013-02-01
22Cx1.2601140.3528442013-03-01
33Ay-1.3696451.5041982013-04-01
41By0.882293-1.1776862013-05-01
51Cy0.5609401.1261212013-06-01
62Ax1.4963090.1316232013-07-01
73Bx0.5571941.5456352013-08-01
81Cx0.518436-0.5811132013-09-01
91Ay-0.607266-1.0326992013-10-01
102By-0.665019-0.6286372013-11-01
113Cy2.146093-0.1757482013-12-01
121Ax0.2035051.4024642013-01-15
131Bx0.6026301.0280112013-02-15
142Cx-0.1378400.0992522013-03-15
153Ay1.5176781.0276512013-04-15
161By-0.949576-0.2686562013-05-15
171Cy-0.328505-0.0928412013-06-15
182Ax0.0893150.7716532013-07-15
193Bx1.889772-0.3482582013-08-15
201Cx1.081143-0.0063872013-09-15
211Ay0.2237910.9443542013-10-15
222By0.111047-1.6349852013-11-15
233Cy-1.4754210.5868252013-12-15
Pivoted DataFrame: D ... E A 1 2 ... 2 3 C x y x ... y x y B ... A 1.125233 -0.383475 1.585623 ... NaN NaN 2.531849 B 1.167782 -0.067283 NaN ... -2.263622 1.197377 NaN C 1.599579 0.232435 1.122273 ... NaN NaN 0.411078 [3 rows x 12 columns]
广告