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
处的元素不在数据帧中,在输出中被忽略