Pandas 数据操作:根据两个变量将长格式转为宽格式

Pandas 数据操作:根据两个变量将长格式转为宽格式

在数据分析和统计建模中,有很多时候需要对原始数据进行预处理和转换,以适合后续的分析和建模需求。其中一项常见的任务是将行向数据的长格式转为列向数据的宽格式。本文将介绍使用Pandas将长格式转为宽格式,以及如何通过两个变量来指定行列的位置,最终得到需要的数据。

阅读更多:Pandas 教程

什么是长格式和宽格式

数据可以以两种不同的格式存在:长格式和宽格式。长格式是指每个行表示一个实例,每个实例对应多个变量的取值。比如,一个学生的考试成绩可能有多门科目,每门科目对应一个分数,以长格式表示就是每个学生占一行,其中的科目和分数两列就构成了多个变量。宽格式则是以更多的列来表示每个实例,每列对应一个变量的取值。以刚才的例子,将每门科目作为新的一列,并将分数填入对应的单元格,就构成了宽格式。

在现实的数据处理过程中,长格式和宽格式各有优缺点,需要根据实际情况来选择。长格式可以更方便地进行数据筛选和过滤,方便查找特定变量的取值;同时长格式的压缩率也更高,更适合一些数据较为稀疏的情况。宽格式则更适合展示多个变量之间的关联和趋势,方便进行可视化和分析。

Pandas 的reshape方法

Pandas是Python中常用的数据处理和分析库,提供了一系列灵活且高效的数据操作方法。其中,reshape方法可以方便地将长格式转为宽格式。具体方法是在原始数据中选择两个变量来确定行列的位置,通过pivot方法完成变形,最终得到新的宽格式数据。

下面,我们来看一下具体的示例:

首先,创建模拟数据:

import pandas as pd

df = pd.DataFrame({
        'item': ['item_A', 'item_B', 'item_C', 'item_A', 'item_B', 'item_C'],
        'day': ['day_1', 'day_1', 'day_1', 'day_2', 'day_2', 'day_2'],
        'price': [1, 2, 3, 4, 5, 6]
    })
print(df)
Python

输出结果为:

     item    day  price
0  item_A  day_1      1
1  item_B  day_1      2
2  item_C  day_1      3
3  item_A  day_2      4
4  item_B  day_2      5
5  item_C  day_2      6
Python

这是一个长格式的数据,其中每个行和每个实例对应的两个变量分别是itemday,而price则是这两者的交叉变量。我们想要将这个数据转为宽格式,其中每行对应一个item,每列对应一个day,同时单元格的值就是对应的price。在Pandas中,可以使用pivot方法轻松实现这一要求:

wide_df = df.pivot(index='item', columns='day', values='price')
print(wide_df)
Python

输出结果为:

day     day_1  day_2
item               
item_A      1      4
item_B      2      5
item_C      3      6
Python

可以看到,原来的6行数据已经被转为了3行,对应每个不同的item。同时每个day也被转为了一个列,并且对应的price值填入了对应的单元格中。

需要注意的是,如果pivot中的indexcolumnsvalues参数没有对应的取值,可能会出现ValueError等错误。此外,在某些情况下,可能需要额外指定聚合方法来处理重复的数据。

使用多个变量转换数据

如果在原始数据中需要同时选择多个变量来确定新数据中的行列位置,可以在pivot方法中同时指定多个参数。下面是一个含有多个枚举值的例子:

df = pd.DataFrame({
        'category': ['A', 'A', 'A', 'B', 'B', 'B'],
        'group': ['X', 'X', 'Y', 'X', 'Y', 'Y'],
        'value': [1, 2, 3, 4, 5, 6]
    })
print(df)
Python

输出结果为:

  category group  value
0        A     X      1
1        A     X      2
2        A     Y      3
3        B     X      4
4        B     Y      5
5        B     Y      6
Python

在这个数据中,categorygroup分别对应行和列的位置,value则是交叉变量。我们想要将这个数据转为宽格式,其中每行对应一个category,每列对应一个group,同时单元格的值就是对应的value。在Pandas中,可以使用类似以下的方法:

wide_df = df.pivot(index='category', columns='group', values='value')
print(wide_df)
Python

输出结果为:

group     X    Y
category        
A         1  3.0
B         4  5.5
Python

可以看到,原始数据中有两个不同的group,分别是XY。这两个变量被转为了两列,并且每行对应一个不同的category,对应的value值填入了对应的单元格中。需要注意的是,由于category=A对应的group中没有Y的取值,因此对应的单元格填入了缺失值NaN,而对于category=B对应的group中,Y的取值有两个,为了避免重复,系统自动进行了平均值处理。

总结

长格式和宽格式都是数据管理中的常见形式,我们需要根据实际需求来选择转换方式。在Pandas中,可以使用pivot方法将长格式数据转换为宽格式数据,同时也可以根据多个变量来定位行列位置。需要注意的是,在使用pivot方法时,需要确保输入的数据格式正确,并在可能情况下指定聚合方法以处理重复数据。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册