Python loc如何知道在设置值时更新哪一行?
我想了解Python loc如何知道在设置值时更新哪一行?,python,pandas,Python,Pandas,我想了解loc是如何工作的。loc的目的是通过标签搜索获取行。但是在上面的代码中,它似乎迭代每一行,并在布尔值为真的新列中插入-1?它是否进行标签搜索?数据帧上唯一的“真实”索引是位置索引(对应于底层结构的0索引值) 因此,loc始终必须“将可能基于标签的密钥转换为位置索引器” 从引擎盖下走出来,上面的文档明确允许: 单个标签,例如5或“A”(请注意,5被解释为索引的标签,而不是索引上的整数位置) 标签的列表或数组,如[A]、[b]、[c'] 带有标签的切片对象,例如“A”:“f” 与
loc
是如何工作的。loc
的目的是通过标签搜索获取行。但是在上面的代码中,它似乎迭代每一行,并在布尔值为真的新列中插入-1?它是否进行标签搜索?数据帧上唯一的“真实”索引是位置索引(对应于底层结构的0索引值)
因此,loc
始终必须“将可能基于标签的密钥转换为位置索引器”
从引擎盖下走出来,上面的文档明确允许:
- 单个标签,例如5或“A”(请注意,5被解释为索引的标签,而不是索引上的整数位置)
- 标签的列表或数组,如[A]、[b]、[c']
- 带有标签的切片对象,例如“A”:“f”
- 与被切片轴长度相同的布尔数组,例如[True,False,True]
- 可对齐的布尔级数。键的索引将在屏蔽前对齐
- 可对齐的索引。返回选择的索引将作为输入
- 一个可调用函数,具有一个参数(调用序列或数据帧),并返回有效的索引输出(上述参数之一)
loc
的好处在于它非常灵活,特别是能够将其与其他操作链接起来:
见:
使用筛选可以写为:
Discount
0 2800
10 1852
20 5000
40 500
Name: MRP, dtype: int64
loc
的另一个巨大好处是它能够索引两个维度:
Discount
0 2800
10 1852
20 5000
Name: MRP, dtype: int64
TLDR;loc
的威力在于它能够将各种输入转换为位置输入,而缺点是转换的开销。数据帧上唯一的“真实”索引是位置索引(对应于底层结构的0索引值)
因此,loc
始终必须“将可能基于标签的密钥转换为位置索引器”
从引擎盖下走出来,上面的文档明确允许:
- 单个标签,例如5或“A”(请注意,5被解释为索引的标签,而不是索引上的整数位置)
- 标签的列表或数组,如[A]、[b]、[c']
- 带有标签的切片对象,例如“A”:“f”
- 与被切片轴长度相同的布尔数组,例如[True,False,True]
- 可对齐的布尔级数。键的索引将在屏蔽前对齐
- 可对齐的索引。返回选择的索引将作为输入
- 一个可调用函数,具有一个参数(调用序列或数据帧),并返回有效的索引输出(上述参数之一)
loc
的好处在于它非常灵活,特别是能够将其与其他操作链接起来:
见:
使用筛选可以写为:
Discount
0 2800
10 1852
20 5000
40 500
Name: MRP, dtype: int64
loc
的另一个巨大好处是它能够索引两个维度:
Discount
0 2800
10 1852
20 5000
Name: MRP, dtype: int64
TLDR;
loc
的威力在于它能够将各种输入转换为位置输入,而缺点是转换的开销。国家文件的第一行:
按标签或布尔数组访问一组行和列
.loc[]
主要基于标签,但也可以与布尔数组一起使用
让我们看看表达式df.MRP>=1500
。这是一个与数据帧具有相同索引的布尔序列:
Product MRP Discount
0 Umbrella 1200 0.0
1 NaN 1500 NaN
2 NaN 1600 NaN
3 Shuttle 352 10.0
4 NaN 5000 NaN
5 Football 500 40.0
因此,很明显,至少有一个与标签匹配的机会。移除标签时会发生什么情况
>>> df.MRP >= 1500
0 False
1 True
2 True
3 False
4 True
5 False
Name: MRP, dtype: bool
因此,当标签不可用时,.loc
将使用数据帧的顺序。这是有道理的。但当标签不匹配时,它是否使用顺序或标签
制作一个系列,如df.MRP>=1500
,但不按顺序查看所选内容:
>>> df.loc[(df.MRP >= 1500).to_numpy(), "Discount"]
1 10
2 0
4 20
Name: Discount, dtype: int64
显然,当可用的标签匹配发生时。如果不可用,则使用订单:
>>> ind1 = pd.Series([True, True, True, False, False, False], index=[1, 2, 4, 0, 3, 5])
>>> df.loc[ind1, "Discount"]
1 10
2 0
4 20
Name: Discount, dtype: int64
另一个有趣的点是,索引表达式的标签必须是超集,而不是数据帧索引的子集。例如,如果将ind
缩短一个元素,则会发生以下情况:
>>> df.loc[ind1.to_numpy(), "Discount"]
0 0
1 10
2 0
Name: Discount, dtype: int64
及
在进行标签匹配时添加额外元素是可以的,但是:
>>> df.loc[ind2.to_numpy(), "Discount"]
...
IndexError: Boolean index has wrong length: 5 instead of 6
请注意,索引6
处的元素不在数据帧中,在输出中被忽略
当然,如果没有标签,较长的阵列也不可接受:
>>> ind3 = pd.Series([True, True, True, False, False, False, True], index=[1, 2, 4, 0, 3, 5, 6])
>>> df.loc[ind3, "Discount"]
1 10
2 0
4 20
Name: Discount, dtype: int64
国家文件的第一行: 按标签或布尔数组访问一组行和列
.loc[]
主要基于标签,但也可以与布尔数组一起使用
让我们看看表达式df.MRP>=1500
。这是一个与数据帧具有相同索引的布尔序列:
Product MRP Discount
0 Umbrella 1200 0.0
1 NaN 1500 NaN
2 NaN 1600 NaN
3 Shuttle 352 10.0
4 NaN 5000 NaN
5 Football 500 40.0
因此,很明显,至少有一个与标签匹配的机会。移除标签时会发生什么情况
>>> df.MRP >= 1500
0 False
1 True
2 True
3 False
4 True
5 False
Name: MRP, dtype: bool
因此,当标签不可用时,.loc
将使用数据帧的顺序。这是有道理的。但当标签不匹配时,它是否使用顺序或标签
制作一个系列,如df.MRP>=1500
,但不按顺序查看所选内容:
>>> df.loc[(df.MRP >= 1500).to_numpy(), "Discount"]
1 10
2 0
4 20
Name: Discount, dtype: int64
显然,当可用的标签匹配发生时。如果不可用,则使用订单:
>>> ind1 = pd.Series([True, True, True, False, False, False], index=[1, 2, 4, 0, 3, 5])
>>> df.loc[ind1, "Discount"]
1 10
2 0
4 20
Name: Discount, dtype: int64
另一个有趣的点是,索引表达式的标签必须是超集,而不是数据帧索引的子集。例如,如果将ind
缩短一个元素,则会发生以下情况:
>>> df.loc[ind1.to_numpy(), "Discount"]
0 0
1 10
2 0
Name: Discount, dtype: int64
及
在进行标签匹配时添加额外元素是可以的,但是:
>>> df.loc[ind2.to_numpy(), "Discount"]
...
IndexError: Boolean index has wrong length: 5 instead of 6
注意,索引6
处的元素不在数据帧中,在输出中被忽略