使用.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
基本上:
我用索引和列初始化一个数据框
我用for循环填充数据框的每一行
我发现索引“ i_max”在列“ A”中找到最大值
我将数据框的行保存为最大值“ row_MAX”
while循环在步骤2到4上进行迭代,并使用一个新变量
row_GLOBALMAX,将值最高的行保存在“ A”行中
代码在第一次执行while循环(i = 0)时按预期工作,但是在第二次迭代(i = 1)时,当我在指定的断点处停止时,我发现了一个问题:
即使我尚未在第二次迭代中分配它们,“ row_MAX”和“ row_GLOBALMAX”都已相对于第一次迭代进行了更改,并遵循了更新的“ df”数据帧中的值。
基本上,.loc函数似乎创建了指向“ df”数据帧特定行的指针,而不是实际上在该特定时刻分配了一个值。
这是正常行为吗?
我应该用什么代替.loc?
最佳答案
我认为loc
和iloc
(未测试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/