使用.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?

最佳答案

我认为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/

10-12 17:03