pandas.DataFrame.loc#
- property DataFrame.loc[来源]#
通过标签或布尔数组访问一组行和列。
`.loc[]` 主要基于标签,但也可以使用布尔数组。
允许的输入包括:
单个标签,例如
5或'a'(请注意,5被解释为索引的*标签*,*绝不*是索引上的整数位置)。标签列表或数组,例如
['a', 'b', 'c']。带标签的切片对象,例如
'a':'f'。警告
请注意,与普通的 Python 切片不同,*开始*和*结束*都包含在内。
与被切片的轴长度相同的布尔数组,例如
[True, False, True]。可对齐的布尔 Series。在遮蔽之前,键的索引将被对齐。
可对齐的 Index。返回的选择的 Index 将是输入。
一个
callable函数,带有一个参数(调用该函数的 Series 或 DataFrame),并且返回有效的索引输出(以上之一)。
更多信息请参见 按标签选择。
- 引发:
- KeyError
如果找不到任何项目。
- IndexingError
如果传入了一个索引键,并且它的索引与框架索引不兼容。
另请参阅
DataFrame.at通过行/列标签对访问单个值。
DataFrame.iloc通过整数位置访问行和列组。
DataFrame.xs从 Series/DataFrame 返回一个横截面(行或列)。
Series.loc使用标签访问值组。
示例
获取值
>>> 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
单个标签。注意,这会返回一行作为一个 Series。
>>> df.loc["viper"] max_speed 4 shield 5 Name: viper, dtype: int64
标签列表。注意,使用
[[]]会返回一个 DataFrame。>>> df.loc[["viper", "sidewinder"]] max_speed shield viper 4 5 sidewinder 7 8
行的单个标签和列的单个标签
>>> df.loc["cobra", "shield"] np.int64(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[ ... pd.Series([False, True, False], index=["viper", "sidewinder", "cobra"]) ... ] max_speed shield sidewinder 7 8
Index(行为与
df.reindex相同)>>> df.loc[pd.Index(["cobra", "viper"], name="foo")] max_speed shield foo cobra 1 2 viper 4 5
返回布尔 Series 的条件
>>> df.loc[df["shield"] > 6] max_speed shield sidewinder 7 8
返回带有指定列标签的布尔 Series 的条件
>>> df.loc[df["shield"] > 6, ["max_speed"]] max_speed sidewinder 7
使用
&的多个条件,返回一个布尔 Series>>> df.loc[(df["max_speed"] > 1) & (df["shield"] < 8)] max_speed shield viper 4 5
使用
|的多个条件,返回一个布尔 Series>>> df.loc[(df["max_speed"] > 4) | (df["shield"] < 5)] max_speed shield cobra 1 2 sidewinder 7 8
请确保每个条件都包含在括号
()中。有关布尔索引的更多详细信息和解释,请参阅 用户指南。返回布尔 Series 的 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
为匹配可调用条件的行设置值
>>> df.loc[df["shield"] > 35] = 0 >>> df max_speed shield cobra 30 10 viper 0 0 sidewinder 0 0
将值添加到匹配的位置
>>> df.loc["viper", "shield"] += 5 >>> df max_speed shield cobra 30 10 viper 0 5 sidewinder 0 0
使用
Series或DataFrame进行设置时,会根据索引标签设置值,而不是根据索引位置。>>> shuffled_df = df.loc[["viper", "cobra", "sidewinder"]] >>> df.loc[:] += shuffled_df >>> df max_speed shield cobra 60 20 viper 0 10 sidewinder 0 0
在具有整数标签索引的 DataFrame 上获取值
使用整数作为索引的另一个示例
>>> 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 获取值
使用具有 MultiIndex 的 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
单个索引元组。注意,这会返回一个 Series。
>>> 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"] np.int64(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
有关高级索引的更多详细信息和解释,请参阅 用户指南。
使用 Series 进行赋值
在将 Series 赋值给 `.loc[row_indexer, col_indexer]` 时,pandas 会根据索引标签对 Series 进行对齐,而不是根据顺序或位置。
使用 .loc 和索引对齐进行 Series 赋值
>>> df = pd.DataFrame({"A": [1, 2, 3]}, index=[0, 1, 2]) >>> s = pd.Series([10, 20], index=[1, 0]) # Note reversed order >>> df.loc[:, "B"] = s # Aligns by index, not order >>> df A B 0 1 20.0 1 2 10.0 2 3 NaN