DataFrame.loc - 使用标签访问数据帧的子集
使用DataFrame的loc属性访问数据帧的子集,可以使用行列标签或布尔数组 进行定位。
属性原型
DataFrame.loc[loc-expr]
- loc-expr:数据定位表达式,可以是:
- 单一标签,例如:5或者'a'
- 标签列表,例如:['a','b','c']
- 标签切片,例如:['a':'f']
- 布尔值数组,应当与要切片的轴等长,例如:[True,False,True]
- callable函数,其参数为要切片的数据帧,返回值是要切片的索引
示例代码
下面的代码创建一个3*2的数据帧:
>>> df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
... index=['cobra', 'viper', 'sidewinder'],
... columns=['max_speed', 'shield'])
>>> df
max_speed shield
cobra 1 2
viper 4 5
sidewinder 7 8
下面的代码使用单个标签创建数据帧切片:
>>> df.loc['viper']
max_speed 4
shield 5
Name: viper, dtype: int64
下面的代码使用标签列表创建数据帧切片,使用[[]]返回数据帧:
>>> df.loc[['viper', 'sidewinder']]
max_speed shield
viper 4 5
sidewinder 7 8
下面的代码使用行列标签返回成员值:
>>> df.loc['cobra', 'shield']
2
下面的代码使用行标签和单个列标签进行切片:
>>> df.loc['cobra':'viper', 'max_speed']
cobra 1
viper 4
Name: max_speed, dtype: int64
下面的代码使用布尔数组对数据帧进行切片:
>>> df.loc[[False, False, True]]
max_speed shield
sidewinder 7 8
下面的代码使用条件表达式返回一个布尔序列:
>>> df.loc[df['shield'] > 6]
max_speed shield
sidewinder 7 8
下面的代码使用条件表达式和列标签返回一个布尔序列:
>>> df.loc[df['shield'] > 6, ['max_speed']]
max_speed
sidewinder 7
下面的代码使用callable函数返回一个布尔序列:
>>> df.loc[lambda df: df['shield'] == 8]
max_speed shield
sidewinder 7 8
下面的代码将匹配的数据帧成员设置为指定的值:
>>> df.loc[['viper', 'sidewinder'], ['shield']] = 50
>>> df
max_speed shield
cobra 1 2
viper 4 50
sidewinder 7 50
下面的代码设置指定行的值:
>>> df.loc['cobra'] = 10
>>> df
max_speed shield
cobra 10 10
viper 4 50
sidewinder 7 50
下面的代码设置指定列的值:
>>> df.loc[:, 'max_speed'] = 30
>>> df
max_speed shield
cobra 30 10
viper 30 50
sidewinder 30 50
下面的代码将匹配条件的行值设置为0:
>>> df.loc[df['shield'] > 35] = 0
>>> df
max_speed shield
cobra 30 10
viper 0 0
sidewinder 0 0
下面的代码使用整数索引进行定位:
>>> df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
... index=[7, 8, 9], columns=['max_speed', 'shield'])
>>> df
max_speed shield
7 1 2
8 4 5
9 7 8
下面的代码使用整数索引对行轴进行切片:
>>> df.loc[7:9]
max_speed shield
7 1 2
8 4 5
9 7 8
下面的代码使用MultiIndex处理数据帧:
>>> tuples = [
... ('cobra', 'mark i'), ('cobra', 'mark ii'),
... ('sidewinder', 'mark i'), ('sidewinder', 'mark ii'),
... ('viper', 'mark ii'), ('viper', 'mark iii')
... ]
>>> index = pd.MultiIndex.from_tuples(tuples)
>>> values = [[12, 2], [0, 4], [10, 20],
... [1, 4], [7, 1], [16, 36]]
>>> df = pd.DataFrame(values, columns=['max_speed', 'shield'], index=index)
>>> df
max_speed shield
cobra mark i 12 2
mark ii 0 4
sidewinder mark i 10 20
mark ii 1 4
viper mark ii 7 1
mark iii 16 36
下面的代码使用单一标签进行定位:
>>> df.loc['cobra']
max_speed shield
mark i 12 2
mark ii 0 4
下面的代码使用索引元组进行定位,返回一个序列:
>>> df.loc[('cobra', 'mark ii')]
max_speed 0
shield 4
Name: (cobra, mark ii), dtype: int64
下面的代码使用行列标签进行切片,返回一个序列:
>>> df.loc['cobra', 'mark i']
max_speed 12
shield 2
Name: (cobra, mark i), dtype: int64
下面的代码使用标签元组进行定位,注意使用[[]]来返回数据帧:
>>> df.loc[[('cobra', 'mark ii')]]
max_speed shield
cobra mark ii 0 4
下面的代码:
>>> df.loc[('cobra', 'mark i'), 'shield']
2
下面的代码:
>>> df.loc[('cobra', 'mark i'):'viper']
max_speed shield
cobra mark i 12 2
mark ii 0 4
sidewinder mark i 10 20
mark ii 1 4
viper mark ii 7 1
mark iii 16 36
下面的代码:
>>> df.loc[('cobra', 'mark i'):('viper', 'mark ii')]
max_speed shield
cobra mark i 12 2
mark ii 0 4
sidewinder mark i 10 20
mark ii 1 4
viper mark ii 7 1