其实记住字符串索引用loc
,整数索引用iloc
就行了。
1.DataFrame.loc
DataFrame.loc
是 pandas
库中用于数据选取和索引操作的一个非常重要且功能强大的属性。
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.iloc
是 pandas
库中用于按位置进行数据选取的一个属性,它允许你基于整数位置(类似于数组的索引方式)来访问 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)
这样会选取位置为 0
和 2
的两行数据,返回的是一个新的 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)
上述代码选取了位置为 0
和 2
的两行以及位置为 0
和 2
的两列交叉的数据,返回的是一个 DataFrame
,仅包含指定的行和列的数据内容。
5. 注意事项
-
索引类型匹配:使用
iloc
时,行和列索引必须是基于整数位置的,不能使用字符串标签等非整数形式的索引去选取数据。如果DataFrame
的行或列使用了自定义的标签索引,那应该使用loc
方法来进行基于标签的选取操作。 -
布尔数组要求:当使用布尔数组进行行或列筛选时,要保证布尔数组的长度和对应的行或列的数量一致,并且需要是
numpy.ndarray
类型(通常可以通过取values
属性来满足类型要求),否则会报错(但是试了一下list也可以)。