2015-02-27 2 views
1

Я использую эту функцию и APScheduler для добавления строк в Dataframe everyhour. Проблема заключается в том, что каждый раз, когда она запускается, она перезаписывает предыдущую запись, поэтому ее не «добавляет» ничего.Append Dataframe в Pandas внутри функции

def SMSx(frame): 
    SMS(frame) 
    frame = frame.append(SMS.SMSdf) 
    frame = frame[frame.a != "test"] 
    frame = DataFrame(frame, columns=['Time', 'Hour', 'Date', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'Total', 'Bucket']) 
    frame.to_excel('Sprint_Log.xlsx', 'Sheet 1', index=False) 
    SMSx.frame = frame 

Если я использую тот же самый код (ниже) и запускаю его вручную, он отлично работает. Я не слишком уверен, что здесь происходит. SMS.SMSdf - это кадр данных из функции SMS.

SMS(frame) 
frame = frame.append(SMS.SMSdf) 
frame = frame[frame.a != "test"] 
frame = DataFrame(frame, columns=['Time', 'Hour', 'Date', 'Day', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'Total', 'Bucket']) 
frame.to_excel('Sprint_Log.xlsx', 'Sheet 1', index=False) 
SMSx.frame = frame 

Благодарим за помощь!

Код, который работал:

def SMSx(frame_temp, frame_perm): 
    SMS(frame_temp) 
    try: 
     frame_perm = DataFrame.from_csv('Sprint_Log.csv') 
    except: 
     pass 
    frame_perm = frame_perm.append(SMS.SMSdf) 
    frame_perm = frame_perm.drop_duplicates() 
    frame_perm = frame_perm[frame_perm.Ready != "test"] 
    frame_perm = DataFrame(frame_perm, columns=['Time', 'Hour', 'Date', 'Day', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'Total', 'Bucket']) 
    frame_perm.to_csv('Sprint_Log.csv') 
    SMSx.frame2 = frame_perm 

ответ

1

Проблема, которую я подозреваю, что вы не return обновленный frame переменной. Пока вы назначаете переменную SMSx в области функций, как только функция завершается, она теряется. Я не знаю, как это работает, однако, так как вы не первый определить переменную SMSx (это название текущей функции, или же глобальная переменная?)

def SMSx(frame): 
    SMS(frame) 
    frame = frame.append(SMS.SMSdf) 
    frame = frame[frame.a != "test"] 
    frame = DataFrame(frame, columns=['Time', 'Hour', 'Date', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'Total', 'Bucket']) 
    frame.to_excel('Sprint_Log.xlsx', 'Sheet 1', index=False) 
    return frame 


while True: 
    frame = SMSx(frame) # The returned frame will be used on the next iteration 

Не видя остальную часть вашего кода, довольно сложно понять, что вы пытаетесь сделать.

+0

Есть ли способ вернуть кадр и запустить строку 'frame = SMSx (frame)' под функцией SMSx? – ik629

+0

только для того, чтобы быть понятным - ваш код действительно сделал именно то, что я хотел - мне просто нужно все в одной функции, поэтому я могу запустить его через APScheduler – ik629

+0

@ ik629 Если вы запустите функцию 'SMSx (frame)' изнутри функция 'SMSx (фрейм)' вы получите бесконечную рекурсию. Глядя на APSScheduler, я не вижу способа улавливать возвращаемые значения из функций. Поскольку вы работаете только каждый час, можете ли вы вместо этого использовать файл для хранения результата? Посмотрите на методы DataFrame '.to_csv' и' .from_csv' вместе с временным файлом. – mfitzp

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