Python reshape()函数在Pandas DataFrame中重新组织数据

Python reshape()函数在Pandas DataFrame中重新组织数据

Pandas是Python中非常重要的数据处理和分析的库之一,它提供了类似于SQL数据库的数据操作工具,同时也能够完美地与NumPy库搭配使用。其中,reshape()函数是Pandas中非常有用的函数之一,可以用于重新组织数据框架,并且可以方便地按照需要将数据框架进行转换、重组等操作。下面我们就来详细地介绍一下Python中reshape()函数在Pandas DataFrame中重新组织数据的使用方法。

pandas.DataFrame()

在使用Python中的reshape()函数之前,我们需要先了解Pandas中的数据框架。Pandas中的数据框架可以被看作是带有行/列标签的二维数据表格,也可以看作是由很多Series对象组成的容器。Pandas中的数据框架可以使用pandas.DataFrame()函数来创建。下面我们来看一下如何使用pandas.DataFrame()函数创建一个数据框架。

import pandas as pd

data = {'name': ['Tom', 'Jerry', 'Alice', 'Bob'], 
        'age': [20, 21, 19, 22], 
        'gender': ['male', 'male', 'female', 'male']}

df = pd.DataFrame(data)

print(df)

输出如下:

    name  age  gender
0    Tom   20    male
1  Jerry   21    male
2  Alice   19  female
3    Bob   22    male

我们可以看到,使用数据字典创建数据框架的时候,其中字典键的名称会被用作数据框架的列名,而每个字典值的列表则被用作数据框架每列对应的数据。

reshape()

在使用Pandas中的reshape()函数时,有两个非常重要的参数,分别是:

  • index: 将某一列设置为行标签。
  • columns: 将某些列设置为列标签。

我们可以通过起始数据框架进行演示,示例代码如下:

import pandas as pd

data = {'month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'], 
        'revenue_2018': [3232, 3452, 3563, 2901, 2913, 3221], 
        'revenue_2019': [3446, 3053, 3674, 3298, 3218, 2922]}

df = pd.DataFrame(data)
df = df.set_index('month')

print(df)

输出如下:

       revenue_2018  revenue_2019
month                            
Jan            3232          3446
Feb            3452          3053
Mar            3563          3674
Apr            2901          3298
May            2913          3218
Jun            3221          2922

从上述代码中,我们可以看到,使用set_index函数将数据框架中的month列设置为行标签,这在后面进一步操作中非常有用。接下来,我们来演示一下如何使用reshape()函数来重新组织数据,使其具有更好的可读性,示例代码如下:

import pandas as pd

data = {'month': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'], 
        'revenue_2018': [3232, 3452, 3563, 2901, 2913, 3221], 
        'revenue_2019': [3446, 3053, 3674, 3298, 3218, 2922]}

df = pd.DataFrame(data)
df = df.set_index('month')

df = df.stack().reset_index()
df.columns = ['Month', 'Year', 'Revenue']

print(df)

输出如下:

   Month          Year  Revenue
0    Jan  revenue_2018     3232
1    Jan  revenue_2019     3446
2    Feb  revenue_2018     3452
3    Feb  revenue_2019     3053
4    Mar  revenue_2018     3563
5    Mar  revenue_2019     3674
6    Apr  revenue_2018     2901
7    Apr  revenue_2019     3298
8    May  revenue_2018     2913
9    May  revenue_2019     3218
10   Jun  revenue_2018     3221
11   Jun  revenue_2019     2922

上述代码中,首先使用stack()函数将数据框架由宽格式转换成长格式。然后使用reset_index()函数进行重置索引,再通过自定义列名columns来对列进行重命名。经过reshape()函数的操作后,我们可以看到数据的格式由原来的6行2列变成了12行3列。其中,Month列重新组织成了行标签,Year列和Revenue列组成了新的列标签。

melt()

在Pandas中,除了reshape()函数之外,还有一种更加方便的方法可以重新组织数据,那就是melt()函数。使用melt()函数可以将多列压缩成为一列,并将这些列标签转换成行中的某个变量。示例代码如下:

import pandas as pd

data = {'name': ['Tom', 'Jerry', 'Alice', 'Bob'],
        'math': [67, 73, 77, 78],
        'science': [85, 77, 76, 76],
        'history': [73, 63, 85, 86]}

df = pd.DataFrame(data)
df_melt = df.melt(id_vars=['name'], var_name='subject', value_name='score')

print(df_melt)

输出如下:

     name  subject  score
0     Tom     math     67
1   Jerry     math     73
2   Alice     math     77
3     Bob     math     78
4     Tom  science     85
5   Jerry  science     77
6   Alice  science     76
7     Bob  science     76
8     Tom  history     73
9   Jerry  history     63
10  Alice  history     85
11    Bob  history     86

在上述代码中,我们使用melt()函数将数据框架进行了重塑,并将每行的学科成绩变成了一个新的列。

pivot()

除了使用melt()函数,我们还可以使用pivot()函数将长格式的数据框架变成宽格式的数据框架,和reshape()函数一样,pivot()函数也需要指定行和列标签。示例代码如下:

import pandas as pd

data = {'name': ['Tom', 'Jerry', 'Alice', 'Bob'],
        'subject': ['math', 'science', 'history', 'math'],
        'score': [67, 73, 77, 78]}

df = pd.DataFrame(data)
df_pivot = df.pivot(index='name', columns='subject', values='score')

print(df_pivot)

输出如下:

subject  history  math  science
name                           
Alice         77   NaN       76
Bob          NaN    78      NaN
Jerry         73   NaN       77
Tom          NaN    67       73

在上述代码中,我们使用pivot()函数将数据框架进行了重塑,并将每行的学科成绩变成了新的列。而在使用pivot()函数进行数据重塑时,我们需要注意的一点是,数据框架中的行/列标签必须是唯一的,否则在重塑过程中可能会出现重复的情况。

结论

正如我们在上述示例中看到的一样,使用Python中reshape()函数在Pandas DataFrame中重新组织数据,可以极大地方便我们日常数据处理的任务。改变原有数据框架的形状,不仅可以使数据更具可读性,也可以方便我们进行更复杂的数据操作和分析。除了reshape()函数之外,melt()函数和pivot()函数也是非常实用的数据重塑工具。熟练使用这些函数,可以让我们更加高效地进行数据处理。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程