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