如何使用 Pandas stack() 将宽数据帧转换为整洁数据帧?
我们有时可能需要一个整洁/长格式的数据来进行数据分析。因此,在 Python 的 Pandas 库中,有几种方法可以将宽格式的数据帧重塑为长/整齐格式的数据帧。在这里,我们将讨论使用 Pandas函数stack() 将数据从宽格式转换为长格式。 stack() 主要是将指定的索引从列堆叠到索引形式。并且它返回一个重新整形的 DataFrame 甚至一个具有多级索引的系列,与当前 DataFrame 相比,具有一个或多个新的最内层,这些级别是通过旋转当前数据帧的列创建的,并输出:
- 系列:如果列只有一个级别
- DataFrame:如果列有多个级别,则新的索引级别取自指定级别。
Syntax: DataFrame.stack(level=- 1, dropna=True)
Parameters –
- level : It levels to stack from the column axis to the index axis. It either takes an int, string or list as input value. And by default is set to -1.
- dropna : It asks whether to drop the rows into the resulting dataFrame or series in case they don’t have any values. It is of bool type and by default set to True.
Returns a stacked DataFrame or series.
现在,让我们开始编码吧!
情况1#:
首先,让我们从一个简单的开始 单级列和广泛的数据形式。
Python3
import pandas as pd
# Single level columns
df_single_level_cols = pd.DataFrame([[74, 80], [72, 85]],
index=['Deepa', 'Balram'],
columns=['Maths', 'Computer'])
print(df_single_level_cols)
Python3
# Single level with stack()
df_single_level_cols.stack()
Python3
# Simple Multi-level columns
multicol1 = pd.MultiIndex.from_tuples([('Science', 'Physics'),
('Science', 'Chemistry')])
df_multi_level_cols1 = pd.DataFrame([[80, 64], [76, 70]],
index=['Deepa', 'Balram'],
columns=multicol1)
print(df_multi_level_cols1)
Python3
# Multi-level stacking with stack
df_multi_level_cols1.stack()
Python3
# Multi-level with missing values
multicol2 = pd.MultiIndex.from_tuples([('English', 'Literature'),
('Hindi', 'Language')])
df_multi_level_cols2 = pd.DataFrame([[80, 75], [80, 85]],
index=['Deepa', 'Balram'],
columns=multicol2)
df_multi_level_cols2
Python3
# Multi-level missing values as NaN
df_multi_level_cols2.stack()
Python3
# Prescribing the level(s) to be stacked
df_multi_level_cols2.stack(0)
# The first parameter controls which level
# or levels are stacked
df_multi_level_cols2.stack([0, 1])
Python3
# Dropping missing values
df_multi_level_cols3 = pd.DataFrame([[None, 80], [77, 82]],
index=['Deepa', 'Balram'],
columns=multicol2)
print(df_multi_level_cols3)
# contains the row with all NaN values since,
# dropna=False
df_multi_level_cols3.stack(dropna=False)
print(df_multi_level_cols3)
Python3
# Drops the row with completely NaN values
df_multi_level_cols3.stack(dropna=True)
print(df_multi_level_cols3)
输出
现在,在我们应用 stack()函数之后,我们将获得一个带有单层列轴的数据框,返回一个系列:
蟒蛇3
# Single level with stack()
df_single_level_cols.stack()
输出:
案例 2#:
现在让我们尝试使用多级列。
蟒蛇3
# Simple Multi-level columns
multicol1 = pd.MultiIndex.from_tuples([('Science', 'Physics'),
('Science', 'Chemistry')])
df_multi_level_cols1 = pd.DataFrame([[80, 64], [76, 70]],
index=['Deepa', 'Balram'],
columns=multicol1)
print(df_multi_level_cols1)
输出:
使用多级列轴堆叠数据框后:
蟒蛇3
# Multi-level stacking with stack
df_multi_level_cols1.stack()
输出:
案例 3#:
现在,让我们尝试使用一些缺失值在常规宽表单中,我们将按原样获取值,因为它的值小于堆叠表单的值:
蟒蛇3
# Multi-level with missing values
multicol2 = pd.MultiIndex.from_tuples([('English', 'Literature'),
('Hindi', 'Language')])
df_multi_level_cols2 = pd.DataFrame([[80, 75], [80, 85]],
index=['Deepa', 'Balram'],
columns=multicol2)
df_multi_level_cols2
输出:
但是当我们堆叠它时,
当堆叠具有多级列的数据帧时,我们可能会丢失值,因为堆叠的数据帧通常比原始数据帧具有更多的值。缺失值用 NaN 填充,就像在本例中一样,英语语言的值未知,因此用 NaN 填充。
蟒蛇3
# Multi-level missing values as NaN
df_multi_level_cols2.stack()
输出:
案例 4#:
除此之外,我们还可以根据我们的偏好包含堆叠的值,因此通过规定要保留的堆栈值。第一个参数实际上控制堆叠的级别。喜欢,
蟒蛇3
# Prescribing the level(s) to be stacked
df_multi_level_cols2.stack(0)
# The first parameter controls which level
# or levels are stacked
df_multi_level_cols2.stack([0, 1])
输出:
案例 5#:
现在,最后让我们检查一下 stack() 中dropna的目的是什么。为此,我们将删除具有完全 NaN 值的行。当包含 NaN 值时,让我们检查常规结果的代码。
蟒蛇3
# Dropping missing values
df_multi_level_cols3 = pd.DataFrame([[None, 80], [77, 82]],
index=['Deepa', 'Balram'],
columns=multicol2)
print(df_multi_level_cols3)
# contains the row with all NaN values since,
# dropna=False
df_multi_level_cols3.stack(dropna=False)
print(df_multi_level_cols3)
输出:
在这里,我们可以看到在 Deepa 索引中,当我们使用 dropna = False 操作时,literature 的值为 NaN(它也包括 NaN 值)
让我们检查一下我们何时使 dropna = True(省略了完整的 NaN 值行)
蟒蛇3
# Drops the row with completely NaN values
df_multi_level_cols3.stack(dropna=True)
print(df_multi_level_cols3)
输出:
因此,这里使 dropna = False 省略了整个文学行,因为它完全是 NaN。