loc
索引器
使用的索引可能不是整数,而是自定义的!!!
表的列索引
列索引是最常见的索引形式,一般通过[]
来实现。通过[列名]
可以从DataFrame
中取出相应的列,返回值为Series
。
import pandas as pd
import numpy as npdf = pd.read_csv('xuexi.csv', usecols = ['School', 'Grade', 'Name', 'Gender', 'Weight', 'Transfer'])
print(df['Name'].head())
如果要取出多个列,则可以通过[列名组成的列表]
,其返回值为一个DataFrame
。
print(df[['Name', 'Gender']].head())
此外,若要取出单列,且列名中不包含空格,则可以用.列名
取出,这和[列名]
是等价的。
print(df.Name.head())
序列的行索引
以字符串为索引的Series
如果取出单个索引的对应元素,则可以使用[item]
,若Series
只有单个值对应,则返回这个标量值,如果有多个值对应,则返回一个Series
。
df = pd.Series(data=[1, 2, 3, 4, 5],index=['a', 'b', 'a', 'a', 'e']
)
print(df['a'])
# a 1
# a 3
# a 4
# dtype: int64print(df['e'])
# 5
如果取出多个索引的对应元素,则可以使用[items的列表]
。
print(df[['a', 'b']])
# a 1
# a 3
# a 4
# b 2
# dtype: int64
如果想要取出某两个索引之间的元素,并且这两个索引是在整个索引中唯一出现,则可以使用切片,,同时需要注意这里的切片会包含两个端点。
df = pd.Series(data=[1, 2, 3, 4, 5],index=['a', 'b', 'c', 'd', 'e']
)
print(df['a':'c'])
# a 1
# b 2
# c 3
# dtype: int64
如果前后端点的值重复出现,那么需要经过排序才能使用切片。
df = pd.Series(data=[1, 2, 3, 4, 5],index=['a', 'b', 'a', 'a', 'e']
)
print(df.sort_index()['a':'b'])
以整数为索引的Series
在使用数据的读入函数时,如果不特别指定所对应的列作为索引,那么会生成从0开始的整数索引作为默认索引。
和字符串一样,如果使用[int]
或[int_list]
,则可以取出对应索引元素的值。
df = pd.Series(data=[1, 2, 3, 4, 5],index=[1,2,1,1,5]
)
print(df[1])
# 1 1
# 1 3
# 1 4
# dtype: int64print(df[2])
# 2
print(df[[1,2]])
# 1 1
# 1 3
# 1 4
# 2 2
# dtype: int64
如果不想陷入麻烦,那么请不要把纯浮点以及任何混合类型(字符串、整数、浮点类型等的混合)作为索引,否则可能会在具体的操作时报错或者返回非预期的结果,并且在实际的数据分析中也不存在这样做的动机。
对于表而言,有两种索引器,一种是基于元素的loc
索引器,另一种是基于位置的iloc
索引器。
loc索引
前面的操作目的是列的获取,下面是行的获取。
loc
索引器的一般形式是loc[*, *]
,其中第一个*
代表行的选择,第二个*
代表列的选择,如果省略第二个位置写作loc[*]
,这个*
是指行的筛选。其中,*
的位置一共有五类合法对象,分别是:
- 单个元素
- 元素列表
- 元素切片
- 布尔列表
- 函数
利用
set_index
方法把Name
列设为索引。import pandas as pd import numpy as npdf = pd.read_csv('xuexi.csv', usecols = ['School', 'Grade', 'Name', 'Gender', 'Weight', 'Transfer'])df_demo = df.set_index('Name') print(df_demo.head())
单个元素
直接取出相应的行或列,如果该元素在索引中重复则结果为DataFrame
,否则为Series
。
print('选取Qiang Sun的数据')
print(df_demo.loc['Qiang Sun']) # 选取Qiang Sun的数据 多个数据
console.divider()
print(df_demo.loc['Quan Zhao']) # 选取Quan Zhao的数据 单个数据
输出:
选取Qiang Sun的数据School Grade Gender Weight Transfer
Name
Qiang Sun Tsinghua University Junior Female 53.0 N
Qiang Sun Tsinghua University Sophomore Female 40.0 N
Qiang Sun Shanghai Jiao Tong University Junior Female NaN N
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
School Shanghai Jiao Tong University
Grade Junior
Gender Female
Weight 53.0
Transfer N
Name: Quan Zhao, dtype: object
可以同时选择行和列。
print(df_demo.loc['Qiang Sun', 'School']) # 返回Series
console.divider()
print(df_demo.loc['Quan Zhao', 'School']) # 返回单个元素
输出:
Name
Qiang Sun Tsinghua University
Qiang Sun Tsinghua University
Qiang Sun Shanghai Jiao Tong University
Name: School, dtype: object
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Shanghai Jiao Tong University
元素列表
取出列表中所有元素值对应的行或列。
print(df_demo.loc[['Qiang Sun','Quan Zhao'], ['School','Gender']])
# School Gender
# Name
# Qiang Sun Tsinghua University Female
# Qiang Sun Tsinghua University Female
# Qiang Sun Shanghai Jiao Tong University Female
# Quan Zhao Shanghai Jiao Tong University Female
元素切片
列表内使用切片。
如果是唯一值的起点和终点字符,那么就可以使用切片。
print(df_demo.loc['Gaojuan You':'Gaoqiang Qian', 'School':'Gender'])
# School Grade Gender
# Name
# Gaojuan You Fudan University Sophomore Male
# Xiaoli Qian Tsinghua University Freshman Female
# Qiang Chu Shanghai Jiao Tong University Freshman Female
# Gaoqiang Qian Tsinghua University Junior Female
如果DataFrame
使用整数索引,其使用整数切片的时候和上面字符串索引的要求一致,都是元素切片,包含端点且起点、终点不允许有重复值。
布尔列表
传入loc
的布尔列表与DataFrame
长度相同,且列表为True
的位置所对应的行会被选中,False
则会被剔除。
print(df_demo.loc[df_demo.Weight>70].head())
也可以通过isin
方法返回的布尔列表等价写出。
print(df_demo.loc[df_demo.Grade.isin(['Freshman', 'Senior'])].head())
对于复合条件而言,可以用|(或), &(且), ~(取反)
的组合来实现
print(df_demo[(df_demo['School'] == 'S_1') & (df_demo['Grade'] == 'G_1')| (df_demo['Weight'] > 70)
])
函数
这里的函数,必须以前面的四种合法形式之一为返回值,并且函数的输入值为DataFrame
本身。函数的形式参数x
本质上即为df_demo
。
def condition(x:pd.DataFrame):return ((x['School'] == 'S_1') & (x['Grade'] == 'G_1')| (x['Weight'] > 70))
print(df_demo.loc[condition])
不要使用链式赋值。在对表或者序列赋值时,应当在使用一层索引器后直接进行赋值操作,这样做是由于进行多次索引后赋值是赋在临时返回的
copy
副本上的,而没有真正修改元素从而报出SettingWithCopyWarning
警告。
- 错误:
df[df['A'] > 1]['B'] = 100
- 正确:
df.loc[df['A'] > 1, 'B'] = 100
Joyful-Pandas-课程详情 | Datawhale