DataFrame.loc
按标签或布尔数组访问一组行和列。
.loc[]
主要基于标签,但也可以与布尔数组一起使用。
允许的输入是:
- 单个标签,例如,
5
或'a'
,(注意:5
被解释为索引的标签,并且从不作为索引的整数位置)。 - 标签列表或数组, 例如,
['a', 'b', 'c']
. - 具有标签的切片对象,例如,
'a':'f'
.
注意:与通常的python切片相反,包括开始和停止
- 与被切片的轴相同长度的布尔数组, 例如,
[True, False, True]
. - 带有一个参数(调用Series,DataFrame或Panel)的可调用函数,它返回索引的有效输出(上述之一)
Raises: | KeyError: 找不到任何元素时 |
例如,
>>> df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],... index=['cobra', 'viper', 'sidewinder'],... columns=['max_speed', 'shield'])>>> df max_speed shieldcobra 1 2viper 4 5sidewinder 7 8
1)获取值
单一标签。 请注意,这会将行作为Series返回。
>>>df.loc['viper']max_speed 4shield 5Name: viper, dtype: int64
标签列表。 注意使用[[]]
返回一个DataFrame。
>>> df.loc[['viper', 'sidewinder']] max_speed shieldviper 4 5sidewinder 7 8
行和列的单个标签
>>> df.loc['cobra', 'shield']2
切片与行的标签和列的单个标签。 如上所述,请注意包含切片的开始和停止。
>>> df.loc['cobra':'viper', 'max_speed']cobra 1viper 4Name: max_speed, dtype: int64
布尔列表,其长度与行轴相同
>>> df.loc[[False, False, True]]
max_speed shield
sidewinder 7 8
条件,返回一个布尔值Series
>>> df.loc[df['shield'] > 6]
max_speed shield
sidewinder 7 8
>>> df.loc[lambda df: df['shield'] == 8]
max_speed shield
sidewinder
条件,返回指定了列标签的布尔Series
>>> df.loc[df['shield'] > 6, ['max_speed']]
max_speed
sidewinder 7
2)赋值
为与标签列表匹配的所有项设置值
>>> df.loc[['viper', 'sidewinder'], ['shield']] = 50>>> df max_speed shieldcobra 1 2viper 4 50sidewinder 7 50
为整行设置值
>>> df.loc['cobra'] = 10>>> df max_speed shieldcobra 10 10viper 4 50sidewinder 7 50
为整个列设置值
>>> df.loc[:, 'max_speed'] = 30>>> df max_speed shieldcobra 30 10viper 30 50sidewinder 30 50
为匹配可调用条件的行设置值
>>> df.loc[df['shield'] > 35] = 0
>>> df
max_speed shield
cobra 30 10
viper 0 0
sidewinder 0 0
3)使用具有整数标签的索引获取DataFrame上的值
另一个使用整数作为索引的例子:
>>> df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],... index=[7, 8, 9], columns=['max_speed', 'shield'])>>> df max_speed shield7 1 28 4 59 7 8
为行使用整数标签切片。如上所述,注意切片的开始和停止都包含在内。
>>> df.loc[7:9]
max_speed shield
7 1 2
8 4 5
9 7 8
4)使用多索引获取值
使用带有多索引的DataFrame的一些示例
>>> 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
单一标签。 请注意,这将返回具有单个索引的DataFrame。
>>> 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
行和列的单个标签。 与传入元组类似,返回一个Series。
>>> df.loc['cobra', 'mark i']
max_speed 12
shield 2
Name: (cobra, mark i), dtype: int64
单元组。 注意使用[[]]返回一个DataFrame。
>>> 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