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()函数也是非常实用的数据重塑工具。熟练使用这些函数,可以让我们更加高效地进行数据处理。