在将.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?
答案 0 :(得分:1)
我认为 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)