我在使用 .loc / .iloc 作为循环的一部分时遇到了一些问题。这是我的代码的简化版本:INDEX=['0', '1', '2', '3', '4']COLUMNS=['A','B','C']df=pd.DataFrame(index=INDEX, columns=COLUMNS)i=0while 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_MAXi+=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?
2 回答
杨魅力
TA贡献1811条经验 获得超6个赞
我想这两个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)
阿晨1998
TA贡献2037条经验 获得超6个赞
添加回答
举报
0/150
提交
取消