📜  如何使用 Pandas stack() 将宽数据帧转换为整洁数据帧?

📅  最后修改于: 2022-05-13 01:54:52.786000             🧑  作者: Mango

如何使用 Pandas stack() 将宽数据帧转换为整洁数据帧?

我们有时可能需要一个整洁/长格式的数据来进行数据分析。因此,在 Python 的 Pandas 库中,有几种方法可以将宽格式的数据帧重塑为长/整齐格式的数据帧。在这里,我们将讨论使用 Pandas函数stack() 将数据从宽格式转换为长格式。 stack() 主要是将指定的索引从列堆叠到索引形式。并且它返回一个重新整形的 DataFrame 甚至一个具有多级索引的系列,与当前 DataFrame 相比,具有一个或多个新的最内层,这些级别是通过旋转当前数据帧的列创建的,并输出:

  • 系列:如果列只有一个级别
  • DataFrame:如果列有多个级别,则新的索引级别取自指定级别。

现在,让我们开始编码吧!

情况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。