gpt4 book ai didi

python - loc/iloc 返回引用还是副本?

转载 作者:行者123 更新时间:2023-12-01 01:02:04 26 4
gpt4 key购买 nike

我在使用 .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)

关于python - loc/iloc 返回引用还是副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55708136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com