2016-02-04 4 views
-1

Я пытаюсь выполнить цикл, который вычисляет новое поле «DELTA», используя значения в существующем фрейме. Моя цель - использовать поле DELTA для вычисления следующей строки поля «КАЧЕСТВО», пока цикл не будет завершен.В то время как цикл перезаписывает поле

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

Каков был вход Input.csv? – user1245262

+0

КАЧЕСТВО: 15 ВОЗРАСТ: 10 – kharn

+0

Пожалуйста, не задавайте этот вопрос хамелеоном - если вам по-прежнему нужна помощь в отладке, отправьте другой вопрос, а не заменяйте его снова и снова. Я вернул его к самому оригинальному вопросу перед всеми модами. – Ajean

ответ

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 

, который не совсем то, что вы хотели, но я не совсем уверен, что логика хочет, так что я не в состоянии изменить команды.

+0

Спасибо, MSeifert и Ajean, вы оба перевели меня вперед. Когда я делаю цикл более длинным, я получаю этот результат: – kharn

+0

@ MSeifert. Когда я делаю счетчик циклов 3, результат печатается следующим образом. AGE QUALITY DELTA -10 15,00 1,50 -11 16,50 1,50 -11 16,50 1,50 -12 18,15 1,65 – kharn

+2

И это хорошо/плохо/не предназначено? Я думаю, что все, что находится за пределами копии, - это просто вопрос отладки кода самостоятельно. См. Например: http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – MSeifert

3

Такое поведение связано с этой строкой в ​​цикле:

Input2 = pd.DataFrame(Input) 

Вы думаете, что делаете копию Input, но вместо этого вы делаете вид, поэтому, когда вы меняете значения в Input2, вы меняете также Input. Конструктор DataFrame имеет ключевое слово copy, по умолчанию значение False. Вы можете проверить это, посмотрев базовые значения

Если это правда, у вас есть представление. Измените линию на

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

Извините, вы уже не отправили ответ с тем же контентом. Но тем не менее +1 за ваш ответ. Несмотря на то, что выход не является тем, что не требуется * ни в одном из наших ответов. – MSeifert

+0

Действительно, я не касался цифр, потому что то, что выходит, именно то, что назначено, я считаю, что OP может изменить эту логику. – Ajean

Смежные вопросы