Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。本文主要介绍一下Pandas中pandas.DataFrame.loc方法的使用。

DataFrame.loc

按标签或布尔数组访问一组行和列。

.loc[] 主要基于标签,但也可以与布尔数组一起使用。

允许的输入是:

  • 单个标签,例如,5'a',(注意:5被解释为索引的标签,并且从不作为索引的整数位置)。
  • 标签列表或数组, 例如, ['a', 'b', 'c'].
  • 具有标签的切片对象,例如, 'a':'f'.

注意:与通常的python切片相反,包括开始和停止

  • 与被切片的轴相同长度的布尔数组, 例如,[True, False, True].
  • 带有一个参数(调用SeriesDataFramePanel)的可调用函数,它返回索引的有效输出(上述之一)

Raises:

KeyError:

找不到任何元素时

例如

>>> 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

1)获取值

单一标签。 请注意,这会将行作为Series返回。

>>>df.loc['viper']max_speed    4shield       5Name: viper, dtype: int64

标签列表。 注意使用[[]]返回一个DataFrame

>>> 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

条件,返回一个布尔值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  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

为匹配可调用条件的行设置值

>>> 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