在Python数据科学领域,Pandas库因其强大的数据处理能力而广受欢迎。在Pandas中,loc和iloc是两个用于数据筛选和更新的重要函数。本文将通过实际代码示例,详细解释这两个函数的使用方法和区别。
Pandas库提供了多种数据筛选方法,其中loc和iloc是最常用的两种。它们可以帮助轻松地在Pandas DataFrame中进行数据选择。
loc是基于标签的,这意味着需要指定行和列的名称来筛选数据。例如,如果想要筛选索引名为1、2或100的行,使用loc函数时,只有当索引名确实是1、2或100时,才能得到结果。因此,即使数据集中的索引不是整数,也可以使用loc函数进行筛选。
与此相反,iloc是基于整数索引的。这意味着需要通过指定行和列的整数索引来筛选数据。例如,如果想要筛选索引为1、2或100的行,无论索引名是什么,iloc都会返回第1、2和100行的数据。
现在,让通过一些实际的Python代码示例,来了解如何使用loc和iloc进行数据选择和更新。
首先,需要一个数据集来应用loc和iloc。将创建一个包含5列的学生数据集——年龄、班级、城市、性别和最喜欢的颜色。这个数据集将包含数值和分类变量。
import pandas as pd
import numpy as np
data = pd.DataFrame({
'age' : [10, 22, 13, 21, 12, 11, 17],
'section' : ['A', 'B', 'C', 'B', 'B', 'A', 'A'],
'city' : ['Gurgaon', 'Delhi', 'Mumbai', 'Delhi', 'Mumbai', 'Delhi', 'Mumbai'],
'gender' : ['M', 'F', 'F', 'M', 'M', 'M', 'F'],
'favourite_color' : ['red', np.NAN, 'yellow', np.NAN, 'black', 'green', 'red']
})
print(data)
在探索数据集时,经常需要根据给定条件筛选数据。例如,可能需要找到所有年龄大于x岁的行,或者城市为Delhi的行等。可以使用pandas.DataFrame.loc[]来解决这类查询,只需在loc语句中传递条件即可。
# 找到所有年龄大于或等于15岁的行
filtered_data = data.loc[data['age'] >= 15]
print(filtered_data)
同样,也可以使用方法loc来根据多个条件筛选数据,例如找到所有年龄大于或等于12岁且性别为男性的行。
# 找到所有年龄大于或等于12岁且性别为男性的行
filtered_data = data.loc[(data['age'] >= 12) & (data['gender'] == 'M')]
print(filtered_data)
使用loc,还可以在PandasDataFrame中选择特定范围的行。如果索引没有按顺序排列,它将只选择索引为1和3的行(如下例所示)。如果索引不是数字,则不能使用loc进行切片,而需要使用iloc函数。
# 使用loc选择索引为1和3的行
sliced_data = data.loc[[1, 3]]
print(sliced_data)
还可以在loc语句中添加列的列表,以选择满足条件的行中的特定列。例如,如果数据集包含数百列,而只想查看其中的一些列,那么可以在loc语句中添加列的列表。
# 选择满足条件的行中的特定列
selected_columns = data.loc[data['age'] >= 12, ['age', 'section']]
print(selected_columns)
这是PythonPandas中最喜欢的技巧之一!经常需要根据某个条件更新数据集中的值。例如,如果年龄大于或等于12岁,希望将班级列的值更新为“M”。
# 更新满足条件的行中特定列的值
data.loc[data['age'] >= 12, 'section'] = 'M'
print(data)
如果想要更新多个列的不同值,可以使用以下语法。在这个例子中,如果年龄大于20岁,loc函数将更新班级列为“S”,城市列为Pune。
# 更新满足条件的行中多个列的值
data.loc[data['age'] > 20, ['section', 'city']] = ['S', 'Pune']
print(data)
当使用iloc时,需要通过整数索引指定行和列。如果只想选择第一行和第三行,只需要在iloc语句中将它们放入列表中。
# 使用iloc选择第一行和第三行
selected_rows = data.iloc[[0, 2]]
print(selected_rows)
之前,使用loc函数从数据集中选择了几列。也可以使用iloc函数来实现这一点。需要注意的是,需要提供列的索引号而不是列名。
# 使用iloc选择特定索引的行和列
selected_rows_columns = data.iloc[[0, 2], [0, 1]]
print(selected_rows_columns)
也可以使用方法iloc来切片DataFrame。需要提供起始索引和结束索引+1来切片给定的DataFrame。即使索引不是有序数字,它也会从起始索引行选择到结束索引。
# 使用iloc选择特定范围的行
range_rows = data.iloc[0:3]
print(range_rows)
# 使用iloc选择特定范围的行和列
range_rows_columns = data.iloc[1:3, 2:4]
print(range_rows_columns)