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
| 2 | 3 | ||
| 股票-A | 股票B | ||
| 12.327710 | 10.862572 | 7.105198 | 8.295885 |
| 11.474872 | 1.563040 | 5.915501 | 6.102915 |
结果
| 2 | 3 | |
| 股票-A | ||
| 12.327710 | 7.105198 | 8.295885 |
| 11.474872 | 5.915501 | 6.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
| 日期 | 组 | 价值 | |
| 0 | 01/15/2022 | A | 9.627767 |
| 1 | 01/16/2022 | A | 11.528057 |
| 2 | 01/17/2022 | A | 13.296501 |
| 3 | 01/15/2022 | B | 2.933748 |
| 4 | 01/16/2022 | B | 2.236752 |
| 5 | 01/17/2022 | B | 7.652414 |
| 6 | 01/15/2022 | C | 11.813549 |
| 7 | 01/16/2022 | C | 11.015920 |
| 8 | 01/17/2022 | C | 0.527554 |
结果
| 组 | A | B | C |
| 日期 | |||
| 01/15/2022 | 8.051752 | 9.571285 | 6.196394 |
| 01/16/2022 | 6.511448 | 8.158878 | 12.865944 |
| 01/17/2022 | 8.421245 | 1.746941 | 12.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 | 德国 | 柏林 | 83783942 | 357021 |
| 1 | 法国 | 巴黎 | 67081000 | 551695 |
| 2 | 西班牙 | 马德里 | 47431256 | 498511 |
| 3 | 意大利 | 罗马 | 60317116 | 301338 |
| 4 | 波兰 | 华沙 | 38383000 | 312685 |
结果
| 首都 | 柏林 | 马德里 | 巴黎 | 罗马 | 华沙 |
| 人口 | 83783942 | 47431256 | 67081000 | 60317116 | 38383000 |
在这个例子中,一个以逗号分隔的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]行将结果输出到终端。
输出。
结果
| 最大 | |||||
| 首都 | 慕尼黑 | 马德里 | 慕尼黑 | 罗马 | 华沙 |
| 人口 | 83783942 | 47431256 | 67081000 | 60317116 | 38383000 |
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 | 米加-史密斯 | 14 | 52 |
| 菲利普-琼斯 | 15 | 65 | |
| 1002 | 本-格莱姆斯 | 16 | 83 |
| 艾丽西亚-希思 | 17 | 99 | |
| 阿奇-尼尔森 | 18 | 78 |
结果
| 等级 | |||
| 米加-史密斯 | 14 | 1001 | 52 |
| 菲利普-琼斯 | 15 | 1001 | 65 |
| 本-格莱姆斯 | 16 | 1002 | 83 |
| 艾丽西亚-希思 | 17 | 1002 | 99 |
| 阿奇-尼尔森 | 18 | 1002 | 78 |
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 | 美国 | 华盛顿 | 328239523 | 9833520 |
| 4 | 波兰 | 华沙 | 38383000 | 312685 |
| 3 | 意大利 | 罗马 | 60317116 | 301338 |
| 1 | 法国 | 巴黎 | 67081000 | 551695 |
| 5 | 俄罗斯 | 莫斯科 | 146748590 | 17098246 |
| 2 | 西班牙 | 马德里 | 47431256 | 498511 |
| 8 | 印度 | 德利 | 1352642280 | 3287263 |
| 0 | 德国 | 柏林 | 83783942 | 357021 |
| 7 | 印度 | 北京 | 1400050000 | 9596961 |
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]行将结果输出到终端。
输出。
| 国家 | 人口 | 面积 | |
| 中国 | 北京 | 1400050000 | 9596961 |
| 法国 | 巴黎 | 67081000 | 551695 |
| 德国 | 柏林 | 83783942 | 357021 |
| 印度 | 德利 | 1352642280 | 3287263 |
| 意大利 | 罗马 | 60317116 | 301338 |
| 波兰 | 华沙 | 38383000 | 312685 |
| 俄罗斯 | 莫斯科 | 146748590 | 17098246 |
| 西班牙 | 马德里 | 47431256 | 498511 |
| 美国 | 华盛顿 | 328239523 | 9833520 |