Pandas数据框架方法:drop_level(), pivot(), pivot_table(), reorder_levels(), sort_values()和 sort_index()。

289 阅读13分钟

Pandas DataFrame/Series有几种方法来处理缺失数据。当应用于一个DataFrame/Series时,这些方法会评估和修改缺失的元素。

这是数据框架方法系列的第13部分

  • **第一部分**主要介绍DataFrame方法abs(),all(),any(),clip(),corr(), 和corrwith()
  • 第二部分重点是DataFrame方法count(),cov(),cummax(),cummin(),cumprod(),cumsum()
  • **第3部分**重点介绍了DataFrame方法describe(),diff(),eval(),kurtosis()
  • **第四部分**重点介绍了DataFrame方法mad(),min(),max(),mean(),median(), 和mode()
  • **第五部分**主要介绍了DataFrame方法pct_change(),quantile(),rank(),round(),prod(), 和product()
  • 第**6部分**主要介绍了DataFrame方法add_prefix(),add_suffix(), 和align()
  • 第**7部分**重点介绍了数据框架方法at_time(),between_time(),drop(),drop_duplicates()duplicated()
  • 第**8部分**重点介绍了数据框架方法equals(),filter(),first(),last(), head(), 和 。tail()
  • 第**9部分**重点介绍数据框架方法equals(),filter(),first(),last(),head(), 和tail()
  • **第10部分**重点介绍了数据框架方法reset_index(),sample(),set_axis(),set_index(),take(), 和truncate()
  • **第11部分**重点介绍了数据框架方法backfill(),bfill(),fillna(),dropna(), 和interpolate()
  • 第**12部分**重点介绍数据框架方法isna(),isnull(),notna(),notnull(),pad()replace()
  • 13部分重点介绍数据框架方法drop_level(),pivot(),pivot_table(),reorder_levels(),sort_values()sort_index()

入门

记住,在每个代码片段的顶部添加 所需的启动代码到每个代码片段的顶部。这个代码段将使本文中的代码能够无误地运行。

必要的启动代码

import pandas as pd
import numpy as np 

在进行任何数据操作之前,需要安装两个新的库。

  • [pandas](https://blog.finxter.com/pandas-quickstart/)库实现了对DataFrame的访问/从DataFrame的访问。
  • 该库支持多维数组。 [numpy](https://blog.finxter.com/numpy-tutorial/)库支持多维数组和矩阵,以及一系列的数学函数。

要安装这些库,请导航到IDE终端。在命令提示符下($),执行下面的代码。对于本例中使用的终端,命令提示符是一个美元符号($)。你的终端提示可能不同。

$ pip install pandas

按下键盘上的<Enter> 键,开始安装过程。

$ pip install numpy

按键盘上的<Enter> 键,开始安装过程。

请随时查看这里安装这些库的正确方法。

如果安装成功,终端会显示一条信息,说明这一点。

DataFrame drop_level()

drop_level()方法从一个DataFrame/Series中删除指定的索引或列。该方法返回一个删除了上述级别/列的DataFrame/Series。

该方法的语法如下。

DataFrame.droplevel(level, axis=0)

参数。

水平。如果级别是一个字符串,这个级别必须存在。如果是一个列表,元素必须存在,并且是索引的级别名称/位置。
轴。如果选择零(0)或索引,则应用于每一列。默认为0(列)。如果零(1)或列,则应用于每一行。

在这个例子中,我们生成随机的股票价格,然后从DataFrame中放弃(移除)级别Stock-B。

nums = np.random.uniform(low=0.5, high=13.3, size=(3,4))
df_stocks = pd.DataFrame(nums).set_index([0, 1]).rename_axis(['Stock-A', 'Stock-B'])
print(df_stocks)

result = df_stocks.droplevel('Stock-B')
print(result)

  • 第[1]行在指定范围内为三(3)个列表生成随机数。每个列表包含四(4)个元素(size=3,4)。输出保存在nums中。
  • 第[2]行创建一个DataFrame,设置索引,并重命名轴。该输出保存到df_stocks。
  • 第[3]行将DataFrame输出到终端。
  • 第[4]行将Stock-B从DataFrame中删除,并将其保存到结果变量中。
  • 第[5]行将结果输出到终端。

输出。

df_stocks

23
股票-A股票B
12.32771010.8625727.1051988.295885
11.4748721.5630405.9155016.102915

结果

23
股票-A
12.3277107.1051988.295885
11.4748725.9155016.102915

DataFrame pivot()

pivot()方法重塑一个DataFrame/Series,并根据列值产生/返回一个透视表。

这个方法的语法如下。

DataFrame.pivot(index=None, columns=None, values=None)

参数。

索引。这个参数可以是一个字符串、对象或一个字符串列表,是可选的。这个选项构成了新的DataFrame/Series索引。如果没有,将选择现有的索引。
列。这个参数可以是一个字符串、对象或字符串的列表,是可选的。构成新的DataFrame/Series列。
值。这个参数可以是一个字符串、对象或前者的列表,是可选的。

在这个例子中,我们为Rivers服装公司生成3天的股票价格样本。列标题显示以下字符。

  • A(代表开盘价)
  • B (代表午盘价格)
  • C (代表开盘价)
cdate_idx = ['01/15/2022', '01/16/2022', '01/17/2022'] * 3
group_lst = list('AAABBBCCC')
vals_lst  = np.random.uniform(low=0.5, high=13.3, size=(9))

df = pd.DataFrame({'dates':  cdate_idx,
                                    'group':  group_lst,
                                   'value':  vals_lst})
print(df)

result = df.pivot(index='dates', columns='group', values='value')
print(result)

  • 第[1]行创建一个日期列表,并将其乘以三(3)。输出是每个日期的三(3)个条目。这个输出保存在cdate_idx中。
  • 第[2]行创建一个列的标题列表(见上面的定义)。每个字符需要三(3)个(9个字符)。这个输出保存在group_lst中。
  • 第[3]行使用np.random.uniform来创建一个在设定范围内的九(9)个数字的随机列表。该输出保存到vals_lst。
  • 第[4]行使用在第[1-3]行创建的所有变量创建了一个DataFrame。输出保存到df。
  • 第[5]行将DataFrame输出到终端。
  • 第[6]行从DataFrame中创建一个透视,并按日期对数据进行分组。输出保存为结果。
  • 第[7]行将结果输出到终端。

输出。

df

日期价值
001/15/2022A9.627767
101/16/2022A11.528057
201/17/2022A13.296501
301/15/2022B2.933748
401/16/2022B2.236752
501/17/2022B7.652414
601/15/2022C11.813549
701/16/2022C11.015920
801/17/2022C0.527554

结果

ABC
日期
01/15/20228.0517529.5712856.196394
01/16/20226.5114488.15887812.865944
01/17/20228.4212451.74694112.896975

DataFrame pivot_table()

pivot_table()方法简化了一个DataFrame,使其只包含特定的数据(列)。例如,我们有一个带有相关细节的国家列表。我们只想显示一列或两列。这个方法可以完成这个任务。

这个方法的语法如下。

DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)

参数。

值。这个参数是要聚合的列,是可选的。
索引。如果该参数是一个数组,它必须与数据的长度相同。它可以包含任何其他数据类型(但不是列表)。
列。如果是一个数组,它必须与数据的长度相同。它可以包含任何其他的数据类型(但不是一个列表)。
Aggfunc。这个参数可以是一个函数的列表。这些名称将显示在相关列名的顶部(见例2)。
Fill_value。这个参数是用于在聚合发生后替换表中缺失值的值。
边距。如果设置为True,该参数将添加行/列数据以创建小计或总计。默认情况下是假的。
Dropna。该参数将不包括任何数值为NaN的列。默认为真。
Margins_name:如果margins参数为True,该参数是包含总数的行/列的名称。
观察值。如果是True,显示观察到的数值。如果是假的,则显示所有的观察值。
排序。默认情况下,排序为真。这些值会自动排序。如果为假,则不进行排序。

在这个例子中,一个以逗号分隔的CSV文件被读入。根据选定的参数创建一个透视表。

代码 - 例1:

df = pd.read_csv('countries.csv')
df = df.head(5)
print(df)

result = pd.pivot_table(df, values='Population', columns='Capital')
print(result)

  • 第[1]行读入一个以逗号分隔的CSV文件,并保存为一个DataFrame (df)。
  • 第[2]行将CSV文件的前五(5)行保存到df中(重写df)。
  • 第[3]行将DataFrame输出到终端。
  • 第[4]行根据人口和资本列从DataFrame创建一个透视表。输出保存为结果。
  • 第[5]行将结果输出到终端。

输出。

df

国家资本人口面积
0德国柏林83783942357021
1法国巴黎67081000551695
2西班牙马德里47431256498511
3意大利罗马60317116301338
4波兰华沙38383000312685

结果

首都柏林马德里巴黎罗马华沙
人口8378394247431256670810006031711638383000

在这个例子中,一个以逗号分隔的CSV文件被读入。根据选定的参数创建了一个透视表。注意max函数。

代码 - 例2

df = pd.read_csv('countries.csv')
df = df.head(5)

result = pd.pivot_table(df, values='Population', columns='Capital', aggfunc=[max])
print(result)

  • 第[1]行读入一个以逗号分隔的CSV文件,并保存为一个DataFrame (df)。
  • 第[2]行将CSV文件的前五(5)行保存到df中(重写df)。
  • 第[3]行根据人口和资本列从DataFrame创建一个透视表。最大人口是aggfunc的一个参数。输出保存到结果中。
  • 第[4]行将结果输出到终端。

输出。

结果

最大
首都慕尼黑马德里慕尼黑罗马华沙
人口8378394247431256670810006031711638383000

DataFrame reorder_levels()

reorder_levels()方法重新排列一个DataFrame/Series的索引。这个方法不能包含任何重复的级别或删除级别。

这个方法的语法如下。

DataFrame.reorder_levels(order, axis=0)

参数。

顺序。这个参数是一个包含新订单级别的列表。这些级别可以是一个位置或一个标签。
轴。如果选择零(0)或索引,则应用于每一列。默认为0(列)。如果是零(1)或列,应用于每一行。

在这个例子中,有五(5)个学生。每个学生都有一些与之相关的数据。等级通过使用np.random.randint()生成。

index = [(1001, 'Micah Smith', 14), (1001, 'Philip Jones', 15), 
         	(1002, 'Ben Grimes', 16), (1002, 'Alicia Heath', 17), (1002, 'Arch Nelson', 18)]
m_index = pd.MultiIndex.from_tuples(index)
grades_lst = np.random.randint(45,100,size=5)
df = pd.DataFrame({"Grades": grades_lst}, index=m_index)
print(df)

result = df.reorder_levels([1,2,0])
print(result)

  • 第[1]行创建了一个Tuples的列表。每个Tuple包含三(3)个值。输出保存在索引中。
  • 第[2]行从第[1]行创建的Tuples列表中创建一个MultiIndex并保存到m_index。
  • 第[3]行在指定范围内生成五(5)个随机等级,并保存到grades_lst。
  • 第[4]行从第[1-3]行的变量中创建一个DataFrame,并保存到df中。
  • 第[5]行将DataFrame输出到终端。
  • 第[6]行按照规定重新排列等级。输出保存到result。
  • 第[7]行将结果输出到终端。

输出。

df

等级
1001米加-史密斯1452
菲利普-琼斯1565
1002本-格莱姆斯1683
艾丽西亚-希思1799
阿奇-尼尔森1878

结果

等级
米加-史密斯14100152
菲利普-琼斯15100165
本-格莱姆斯16100283
艾丽西亚-希思17100299
阿奇-尼尔森18100278

DataFrame sort_values()

sort_values()方法对DataFrame的元素进行排序(重新排列)。

这个方法的语法如下。

DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)

参数。

通过。这个参数是一个字符串或一个字符串列表。这些包括要排序的索引级别/列。取决于所选的轴。
轴。如果选择了零(0)或索引,应用于每一列。默认为0(列)。如果是零(1)或列,应用于每一行。
升序。默认情况下,排序是升序的。如果是False,则是降序。
Inplace(原地)。如果是False,创建一个对象的副本。如果是True,原始对象更新。默认情况下,是假的。
类型。可用的选项是quicksort, mergesort, heapsort, 或 stable。默认情况下是quicksort。参见numpy.sort()获取更多细节。
Na_position(位置)。可用的选项是第一和最后。默认情况下是最后一个。如果选择第一,所有的NaN值都会移到开头。最后一个会移到最后。
Ignore_index:如果为真,轴的编号为0、1、2,等等。默认情况下是假的。
键。这个参数在排序前将函数应用于数值。数据必须是系列格式,适用于每一列。

在这个例子中,一个以逗号分隔的CSV文件被读入。这个DataFrame以降序方式对Capital列进行排序。

df = pd.read_csv('countries.csv')
result = df.sort_values(by=['Capital'], ascending=False)
print(result)

  • 第[1]行读入一个以逗号分隔的CSV文件并保存到df。
  • 第[2]行对DataFrame中的Capital列按降序排序。输出保存到result。
  • 第[3]行将结果输出到终端。

输出。

国家资本人口地区
6美国华盛顿3282395239833520
4波兰华沙38383000312685
3意大利罗马60317116301338
1法国巴黎67081000551695
5俄罗斯莫斯科14674859017098246
2西班牙马德里47431256498511
8印度德利13526422803287263
0德国柏林83783942357021
7印度北京14000500009596961

DataFrame sort_index()

sort_index()方法对DataFrame进行排序。

这个方法的语法如下。

DataFrame.sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, ignore_index=False, key=None)
轴。如果选择了零(0)或索引,则应用于每一列。默认为0(列)。如果是零(1)或列,应用于每一行。
水平。这个参数是一个整数,级别名称,或者一个整数/级别名称的列表。如果不为空,则对所选索引级别的值进行排序。
升序。默认为True。排序以升序进行。如果为假,则为降序。
Inplace(就地)。如果是False,创建一个对象的副本。如果是True,则更新原始对象。默认情况下是假的。
类型。可用的选项是quicksort, mergesort, heapsort, 或 stable。默认情况下是quicksort。参见numpy.sort()获取更多细节。
Na_position(位置)。可用的选项是第一和最后。默认为最后一个。如果选项是第一,所有的NaN值都移到开头,最后一个移到结尾。
Ignore_index:如果为真,轴的编号为0、1、2,等等。默认情况下,为假。
键。这个参数在排序前将函数应用于数值。数据必须是系列格式,适用于每一列。

在这个例子中,一个以逗号分隔的CSV文件被读入一个DataFrame。这个DataFrame根据索引Country列进行排序。

df = pd.read_csv('countries.csv')
df = df.set_index('Country')
result = df.sort_index()
print(result)

  • 第[1]行读入一个以逗号分隔的CSV文件并保存到df。
  • 第[2]行将DataFrame的索引设置为Country。输出保存到df(覆盖原始df)。
  • 第[3]行对DataFrame (df)的索引列(Country)按升序排序(默认)。输出结果保存在result中。
  • 第[4]行将结果输出到终端。

输出。

国家人口面积
中国北京14000500009596961
法国巴黎67081000551695
德国柏林83783942357021
印度德利13526422803287263
意大利罗马60317116301338
波兰华沙38383000312685
俄罗斯莫斯科14674859017098246
西班牙马德里47431256498511
美国华盛顿3282395239833520