我正在尝试使用现有数据框中的值来执行计算新字段“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
答案 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保存了引用而不是副本。因此,每个操作都在Input
和Input2
上完成,只显示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
这不是你想要的,但我不确定需要什么逻辑,所以我无法改变命令。