详解DataFrame的loc和iloc

其实记住字符串索引用loc,整数索引用iloc就行了

1.DataFrame.loc

DataFrame.locpandas 库中用于数据选取和索引操作的一个非常重要且功能强大的属性。

1. 基本语法和作用

df.loc[row_indexer, column_indexer]

其中,df 是一个 DataFrame 实例,row_indexer 用于指定行的索引(可以是单个索引值索引标签的列表切片,或者是一个布尔数组等,用于筛选出符合条件的行),column_indexer 用于指定列的索引(同样可以是单个列名列名的列表切片等,用于选取相应的列)。它的主要作用就是基于指定的行和列的索引条件,从 DataFrame 中精准地选取数据子集。

2. 行索引操作

(1)使用单个索引值选取行

如果行索引是标签形式(例如使用字符串作为行索引),可以直接用对应标签选取一行数据:

import pandas as pd

data = {'name': ['Alice', 'Bob', 'Charlie'],
        'age': [25, 30, 35],
        'city': ['New York', 'London', 'Paris']}
df = pd.DataFrame(data, index=['a', 'b', 'c'])

row_a = df.loc['a']
print(row_a)

上述代码中,df 的行索引为 ['a', 'b', 'c'],通过 df.loc['a'] 就可以获取索引标签为 'a' 的那一行数据,返回的结果是一个 Series,其索引为原 DataFrame 的列名,值为该行对应的数据。

(2)使用索引标签列表选取多行
selected_rows = df.loc[['a', 'c']]
print(selected_rows)

这样就会选取索引为 'a''c' 的两行数据,返回的是一个新的 DataFrame,结构与原 DataFrame 保持一致,只是包含了指定的行。

(3)使用切片选取连续的行
slice_rows = df.loc['a':'c']
print(slice_rows)

注意,这里使用切片时,包含切片的起始和结束索引对应的行(与 Python 内置的切片在某些细节上有区别,Python 内置切片对于 start:stop一般不包含 stop 对应的元素)。

(4)使用布尔数组进行行筛选
bool_array = df['age'] > 30
selected_rows_by_bool = df.loc[bool_array.values] #直接用bool_array或者list(bool_array)也可以
print(selected_rows_by_bool)

这里先通过 df['age'] > 30 生成了一个布尔数组,对应 True 的行就会被 df.loc 选取出来,这种方式在根据复杂条件筛选行数据时非常常用。

3. 列索引操作

(1)使用单个列名选取列
name_column = df.loc[:, 'name']
print(name_column)

这里 : 在行索引位置,表示选取所有行,而 'name' 在列索引位置,表示只选取 'name' 列,返回结果是一个 Series,索引为原 DataFrame 的行索引,值为 'name' 列对应的数据。

(2)使用列名列表选取多列
selected_columns = df.loc[:, ['name', 'age']]
print(selected_columns)

这样就会选取 'name''age' 两列数据,返回的是一个新的 DataFrame,包含了指定的列以及所有行的数据。

(3)使用切片选取连续列(较少用,但可行)
slice_columns = df.loc[:, 'name':'age']
print(slice_columns)

4. 混合使用行和列索引

subset = df.loc[['a', 'c'], ['name', 'age']]
print(subset)

5. 注意事项

  • 索引类型匹配:使用 loc 时要确保行和列的索引类型与设置的索引器相匹配,例如行索引如果是字符串标签,就不能用整数去选取;如果是整数索引,也要按照整数的规则来操作(不过整数索引一般用 iloc 更合适,后面会提到区别)。

  • 布尔数组长度:当使用布尔数组进行行或列筛选时,要保证布尔数组的长度和对应的行或列的数量一致,否则会报错。

2.DataFrame.iloc

DataFrame.ilocpandas 库中用于按位置进行数据选取的一个属性,它允许你基于整数位置(类似于数组的索引方式)来访问 DataFrame 中的行和列

1. 基本语法和作用

df.iloc[row_indexer, column_indexer]

其中,df 是一个 DataFrame 实例,row_indexer 用于指定行的位置索引(可以是单个整数整数列表整数切片,或者布尔数组等,用于筛选出符合条件的行),column_indexer 用于指定列的位置索引(同样可以是单个整数整数列表整数切片等,用于选取相应的列)。其主要作用是依据指定的行和列的位置信息,精准地从 DataFrame 中选取数据子集。

2. 行位置索引操作

(1)使用单个整数选取行
import pandas as pd

data = {'name': ['Alice', 'Bob', 'Charlie'],
        'age': [25, 30, 35],
        'city': ['New York', 'London', 'Paris']}
df = pd.DataFrame(data)

row_0 = df.iloc[0]
print(row_0)
"""
name       Alice
age           25
city    New York
Name: 0, dtype: object
"""

上述代码中,df.iloc[0] 选取了 DataFrame 中位置为 0(第一行,因为索引从 0 开始计数)的那一行数据,返回的结果是一个 Series,其索引为原 DataFrame 的列名,值为该行对应的数据。

(2)使用整数列表选取多行

传入一个整数列表就能选取多行数据。

selected_rows = df.iloc[[0, 2]]
print(selected_rows)

这样会选取位置为 02 的两行数据,返回的是一个新的 DataFrame,结构与原 DataFrame 保持一致,只是包含了指定的行。

(3)使用切片选取连续的行

像使用普通切片一样,可以选取连续的行。

slice_rows = df.iloc[0:2]
print(slice_rows)

这里使用切片 0:2 选取了从位置 0(包含)到位置 2(不包含)的行,也就是第一行和第二行数据,返回的是一个新的 DataFrame。需要注意的是,这种切片方式遵循 Python 内置切片的常规规则(start:stop 中不包含 stop 对应的元素),和 loc 在切片使用上有所区别(loc 使用切片选取行时,包含切片的起始和结束索引对应的行)。

(4)使用布尔数组进行行筛选

可以基于某个条件生成布尔数组,再用这个布尔数组来筛选行。不过需要确保布尔数组的长度和 DataFrame 的行数一致

bool_array = df['age'] > 30
selected_rows_by_bool = df.iloc[bool_array.values] # iloc要求传入的布尔数组是 numpy.ndarray 类型(list也可以)
print(selected_rows_by_bool)

这里先通过 df['age'] > 30 生成了一个布尔数组,然后取其 values 属性(因为 iloc 要求传入的布尔数组是 numpy.ndarray 类型,list也可以),对应 True 的行就会被 df.iloc 选取出来,这种方式在根据复杂条件筛选行数据时比较常用。

3. 列位置索引操作

(1)使用单个整数选取列
name_column = df.iloc[:, 0]
print(name_column)

这里 : 在行索引位置,表示选取所有行,而 0 在列索引位置,表示只选取第一列(因为列索引也是从 0 开始计数),返回结果是一个 Series,索引为原 DataFrame 的行索引,值为第一列对应的数据。

(2)使用整数列表选取多列
selected_columns = df.iloc[:, [0, 2]]
print(selected_columns)

这样就会选取第一列和第三列的数据,返回的是一个新的 DataFrame,包含了指定的列以及所有行的数据。

(3)使用切片选取连续列
slice_columns = df.iloc[:, 0:2]
print(slice_columns)

4. 混合使用行和列位置索引

可以同时指定复杂的行和列位置索引条件来选取特定的数据子集。

subset = df.iloc[[0, 2], [0, 2]]
print(subset)

上述代码选取了位置为 02 的两行以及位置为 02 的两列交叉的数据,返回的是一个 DataFrame,仅包含指定的行和列的数据内容。

5. 注意事项

  • 索引类型匹配:使用 iloc 时,行和列索引必须是基于整数位置的,不能使用字符串标签等非整数形式的索引去选取数据。如果 DataFrame 的行或列使用了自定义的标签索引,那应该使用 loc 方法来进行基于标签的选取操作。

  • 布尔数组要求:当使用布尔数组进行行或列筛选时,要保证布尔数组的长度和对应的行或列的数量一致,并且需要是 numpy.ndarray 类型(通常可以通过取 values 属性来满足类型要求),否则会报错(但是试了一下list也可以)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaiaaaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值