如何用Pandas stack()将宽幅数据框转换为整齐的数据框?
我们有时可能需要一个整齐/长形的数据来进行数据分析。因此,在Python的Pandas库中,有一些方法可以将一个宽格式的数据框架重塑为一个长/整洁的数据框架。在这里,我们将讨论使用pandas函数stack()将数据从宽格式转换为长格式。stack()主要是将指定的索引从列到索引的形式进行堆叠。并且它返回一个重塑的DataFrame,甚至是一个具有多级索引的系列,与当前DataFrame相比,有一个或多个新的最内层,这些层是通过对当前数据框架的列进行透视而创建的,并输出一个。
- 系列:如果列有一个单层
- DataFrame:如果列有多个级别,那么新的索引级别是(是)从指定的级别中抽取。
语法: DataFrame.stack(level=- 1, dropna=True)
参数 –
- level : 它从列axis到索引axis进行堆叠。它接受一个int、string或list作为输入值。默认情况下,它被设置为-1。
- dropna : 它询问在行没有任何值的情况下,是否将其丢入结果的数据框架或系列中。它是bool类型的,默认设置为True。
返回一个堆叠的数据框架或系列。
现在,让我们开始编码吧!
Case 1#:
首先,让我们从一个简单的单级列和一个广泛的数据形式开始。
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)
输出
现在,在我们应用stack()函数之后,我们将得到一个带有单级列axis的数据框架,返回一个系列。
# Single level with stack()
df_single_level_cols.stack()
输出:
Case 2#:
现在让我们试试多层次的列。
# 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)
输出:
在用多级列axis堆叠数据框架后。
# Multi-level stacking with stack
df_multi_level_cols1.stack()
输出:
Case 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填充。
# Multi-level missing values as NaN
df_multi_level_cols2.stack()
输出:
Case 4#:
除此之外,我们还可以根据我们的喜好来包含堆叠的值,因此通过规定堆叠的值来保留。第一个参数实际上是控制哪一层或哪几层被堆叠。比如。
# 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])
输出:
Case 5#:
现在,最后让我们检查一下 stack() 中 dropna 的目的是什么。为此,我们将删除那些完全为NaN值的行。让我们检查一下包含NaN值时的常规结果的代码。
# 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值行)时。
# Drops the row with completely NaN values
df_multi_level_cols3.stack(dropna=True)
print(df_multi_level_cols3)
输出:
所以,这里让dropna = False将文学行作为一个整体省略,因为它完全是NaN。