while循环覆盖字段

时间:2016-02-04 15:01:52

标签: python numpy pandas while-loop

我正在尝试使用现有数据框中的值来执行计算新字段“DELTA”的循环。我的目标是使用DELTA字段计算字段“QUALITY”的下一行,直到循环完成。

import pandas as pd
import csv
import numpy as np

Input = pd.read_csv('C:/PyTemp/Input.csv')

Input = pd.DataFrame(Input)

print(Input)

   QUALITY  AGE
0       15   10

AGE = Input['AGE']

QUALITY = Input['QUALITY']

loopcount = 2
i = 1

while i < loopcount:

    Input['DELTA'] = QUALITY * .1

    Input2 = pd.DataFrame(Input)

    Input2['AGE'] = Input['AGE'] + 1

    Input2['DELTA'] = Input2['QUALITY'] * .1

    Input2['QUALITY'] = Input2['QUALITY'] + Input2['DELTA']

    Input = Input.append(Input2)

    i += 1


print (Input)

我的结果:

   QUALITY  AGE  DELTA
0     16.5   11    1.5
0     16.5   11    1.5

我就是这样:

    QUALITY  AGE     DELTA
0     15      10      1.5
0   16.5      11     1.65

2 个答案:

答案 0 :(得分:3)

此行为是由于循环中的这一行:

Input2 = pd.DataFrame(Input)

您认为您正在制作Input的副本,而是在制作视图,因此当您更改Input2中的值时,您也会更改Input。 DataFrame构造函数有一个copy关键字,默认为False。您可以通过查看基础值

来测试这一点
Input2.values.base is Input.values.base

如果这是真的,你有一个观点。将行更改为

Input2 = pd.DataFrame(Input, copy=True)

答案 1 :(得分:2)

问题是Pandas Dataframe保存了引用而不是副本。因此,每个操作都在InputInput2上完成,只显示Input中设置的内容。另请参阅pandas.DataFrame Reference

import pandas as pd
import csv
import numpy as np

Input = pd.DataFrame({'AGE': 10, 'QUALITY':15}, index=[0])
print(Input)
AGE = Input['AGE']
QUALITY = Input['QUALITY']
loopcount = 2
i = 1
while i < loopcount:
    Input['DELTA'] = QUALITY * .1
    Input2 = pd.DataFrame(Input, copy=True) # Here is the change
    Input2['AGE'] = Input['AGE'] + 1
    Input2['DELTA'] = Input2['QUALITY'] * .1
    Input2['QUALITY'] = Input2['QUALITY'] + Input2['DELTA']
    Input = Input.append(Input2)
    i += 1


print (Input)

此输出

   AGE  QUALITY  DELTA
0   10     15.0    1.5
0   11     16.5    1.5

这不是你想要的,但我不确定需要什么逻辑,所以我无法改变命令。