loc / iloc是否返回引用或副本?

时间:2019-04-16 12:26:38

标签: python pandas dataframe

在将.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?

1 个答案:

答案 0 :(得分:1)

认为 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)