繁体   English   中英

loc/iloc 是否返回引用或副本?

[英]Does loc/iloc return a reference or a copy?

我在使用 .loc / .iloc 作为循环的一部分时遇到了一些问题。 这是我的代码的简化版本:


INDEX=['0', '1', '2', '3', '4']
COLUMNS=['A','B','C']
df=pd.DataFrame(index=INDEX, columns=COLUMNS)
i=0

while i<1000:

    for row in INDEX:
        df.loc[row] = function()
    #breakpoint

    i_max = df['A'].idxmax()
    row_MAX=df.loc[i_max]

    if i == 0:
        row_GLOBALMAX=row_MAX
    elif row_MAX > row_GLOBALMAX:
        row_GLOBALMAX=row_MAX

i+=1

基本上:

  1. 我用索引和列初始化数据框

  2. 我用 for 循环填充数据帧的每一行

  3. 我发现索引“i_max”在“A”列中找到最大值

  4. 我保存了数据帧的行,其中值为最大值 'row_MAX'

  5. while 循环迭代第 2 步到第 4 步,并使用新变量 row_GLOBALMAX 来保存“A”行中具有最高值的行

该代码在第一次执行 while 循环 (i=0) 期间按预期工作,但是在第二次迭代 (i=1) 时,当我停在指定的断点处时,我观察到一个问题:'row_MAX' 和 'row_GLOBALMAX' 都有尽管我尚未在第二次迭代中分配它们,但已经相对于第一次迭代进行了更改并遵循了更新后的“df”数据帧中的值。

基本上,似乎 .loc 函数创建了一个指向“df”数据帧特定行的指针,而不是在那个特定时刻实际分配一个值。 这是正常行为吗? 我应该使用什么来代替 .loc?

认为lociloc (未测试iloc )都将指向数据帧的特定索引。 他们不制作该行的副本。

您可以在行上使用copy()方法来解决您的问题。

import pandas as pd
import numpy as np

INDEX=['0', '1', '2', '3', '4']
COLUMNS=['A','B','C']

df=pd.DataFrame(index=INDEX, columns=COLUMNS)

np.random.seed(5)

for idx in INDEX:
    df.loc[idx] = np.random.randint(-100, 100, 3)

print("First state")
a_row = df.loc["3"]
a_row_cp = a_row.copy()

print(df)
print("---\n")
print(a_row)

print("\n==================================\n\n\n")

for idx in INDEX:
    df.loc[idx] = np.random.randint(-100, 100, 3)

print("Second state")
print(df)
print("---\n")
print(a_row)
print("---\n")
print(a_row_cp)

根据官方文档

df.loc[] = value

变成

df.loc.__setitem__((slice())), value)

所以在任何地方都没有创建原始数据框的副本。 该操作是在原始数据帧的视图上完成的。 这是推荐的分配方式。 .

df.loc[]保证是df本身并修改了索引行为,因此df.loc.__getitem__ / df.loc.__setitem__直接对 df 进行操作。

问题和不确定性(查看与复制)始于链接索引的情况,您可以在此处阅读更多内容

另外,请注意有时熊猫的赋值警告可能是误报 -> 即当您正确使用df.loc[]进行赋值但收到警告告诉您应该使用df.loc[] ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM