如何调整 Pandas Series 的形状?
我们可以使用转置、reshape 方法和 melt 函数等方法来调整 Pandas 系列。Pandas 系列是一个一维标签数组,它可以容纳任何类型的数组(整数、浮点数、字符串等)。它类似于 NumPy 数组,但每个元素都关联了一个索引,该索引可以用来访问各个值。重塑是指改变 Pandas 系列的形状或结构,以便以各种方式使用数据。
算法
使用不同方法重塑 Pandas 系列的一般算法如下所示 −
用一些数据创建一个 Pandas 系列。
使用 reshape() 方法将系列的形状更改为所需的形状。
使用 stack() 方法将系列从宽格式转换为长格式(如果需要)。
使用 melt() 方法将系列从宽格式转换为长格式(如果需要)。
使用 unstack() 方法将系列从长格式转换为宽格式(如果需要)。
使用 pivot() 方法将系列从长格式转换为宽格式(如果需要)。
如有需要,可以使用 T 属性来转置 series。
方法 1:使用 Transpose 属性
transpose 函数 (T) 可用于切换 series 的行和列。当我们需要以不同方式可视化数据时,此功能非常有用。
语法
在此,T 是一种属性,而不是方法,因此在使用它时不需要使用圆括号。此外,由于它是一种属性,而不是方法,因此不能接受任何参数。T 属性会返回一个新 DataFrame,其行和列已互换。
示例
在下例中,我们创建了一个 pandas series,然后使用 transpose 函数转置 pandas series,最后输出转置后的 series。
import pandas as pd # Create a Series s = pd.Series([1, 2, 3, 4]) # Transpose the Series s_transposed = s.T # Print the transposed Series print(s_transposed)
输出
0 1 1 2 2 3 3 4 dtype: int64
方法 2:使用 reshape 方法。
可以使用 reshape 方法来更改 series 的形状。此方法要求新形状与原始形状兼容。
语法
DataFrame.reshape(shape[, order])
在此,shape 参数指定数组的新维度,而可选的 order 参数指定数组元素的排列顺序。
示例
在下例中,使用 values.reshape() 方法重塑 pandas series。首先创建包含 1 到 9 的值的 series。然后,使用 values.reshape(3,3) 将 series 重塑为 3x3 大小的矩阵。
import pandas as pd import numpy as np # Create a Series s = pd.Series(np.arange(1, 10)) # Reshape the Series s_reshaped = s.values.reshape((3, 3)) # Print the reshaped Series print(s_reshaped)
输出
[[1 2 3] [4 5 6] [7 8 9]]
方法 3:使用 Melt 函数
可以使用 melt 函数解除 series 的透视。此函数会为原始 series 中的每个唯一值创建一个新数据帧,并为每个唯一值组合创建一个行。
语法
DataFrame.melt([id_vars, value_vars, ...], ...)
在此, id_vars 参数指定要用作标识符变量的列,value_vars 参数指定要取消透视的列,还可以使用其他参数自定义输出。
示例
在下例中,我们首先使用 reset_index 方法将 Series s 转换为 DataFrame,该方法会创建一个新的 'index' 列,其中包含原始 Series 索引值。然后我们在此 DataFrame 上使用 melt 函数,并将 'index' 指定为 id_vars 参数,并指定 '0'(包含原始 Series 值的列的名称)作为 value_vars 参数。
import pandas as pd # Create a Series s = pd.Series({'A': 1, 'B': 2, 'C': 3}) # Convert the Series to a DataFrame using reset_index() df = s.reset_index() # Melt the DataFrame df_melted = pd.melt(df, id_vars='index', value_vars='0') # Print the melted DataFrame print(df_melted)
输出
index variable value 0 A 0 1 1 B 0 2 2 C 0 3
方法 4:使用 unstack() 方法
Pandas 中的 unstack() 方法用于将多级索引 Series 或 DataFrame 重塑为宽格式。此方法本质上是将多级索引的最内层级旋转为新 DataFrame 的列。unstack() 方法是 stack() 方法的逆方法。
语法
Series.unstack(level=-1, fill_value=None)
在此,level 参数指定要取消堆叠的索引层,而 fill_value 参数指定要填充缺失值的值。
示例
在下例中,我们首先创建一个具有两个索引层(“First”和“Second”)的多级索引 DataFrame df。然后我们对 DataFrame 使用
unstack() 方法,将最内层“Second”旋转为新 DataFrame 的列。生成的 DataFrame df_unstacked 具有列“A”和“B”,原始索引层“First”和“Second”保留为行标签。
import pandas as pd # Create a multi-level index DataFrame df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=pd.MultiIndex.from_tuples([('X', 'a'), ('X', 'b'), ('Y', 'c')], names=['First', 'Second'])) # Unstack the DataFrame df_unstacked = df.unstack() # Print the unstacked DataFrame print(df_unstacked)
输出
A B Second a b c a b c First X 1.0 2.0 NaN 4.0 5.0 NaN Y NaN NaN 3.0 NaN NaN 6.0
方法 5:使用 pivot() 方法
Pandas 中的 pivot() 方法用于将 DataFrame 从长格式重塑为宽格式。此方法采用三个参数:index、columns 和 values。index 参数指定要用作结果 DataFrame 的行索引的列,columns 参数指定要用作结果 DataFrame 的列索引的列,values 参数指定要用作结果 DataFrame 的值。
语法
DataFrame.pivot([index, columns, values])
在此,index 参数指定要作为行索引的列,columns 参数指定要作为列索引的列,values 参数指定要作为数据值使用的列。
示例
在下例中,我们首先使用三列“Year”、“Quarter”和“Sales”创建一个长格式的 DataFrame df。然后,我们在 DataFrame 上使用 pivot() 方法,指定“Year”为 index 参数,“Quarter”为 columns 参数,“Sales”为 values 参数。结果 DataFrame df_pivoted 有两列“Q1”和“Q2”,其中“Year”为行索引。
import pandas as pd # Create a long format DataFrame df = pd.DataFrame({'Year': [2019, 2019, 2020, 2020], 'Quarter': ['Q1', 'Q2', 'Q1', 'Q2'], 'Sales': [100, 200, 150, 250]}) # Pivot the DataFrame df_pivoted = df.pivot(index='Year', columns='Quarter', values='Sales') # Print the pivoted DataFrame print(df_pivoted)
输出
Quarter Q1 Q2 Year 2019 100 200 2020 150 250
结论
在本文中,我们讨论了如何使用 transpose、reshape 和 melt 函数等方法重塑 Pandas 系列。我们可以重塑 Pandas 系列,将数据转换为不同的格式,用于可视化、聚合或分组数据,以及将多个数据系列合并和组合到数据帧中。