Добавление значений в столбец фрейма данных с определенным номером строки

#python #pandas

#python #pandas

Вопрос:

У меня есть df вызов фрейма данных, который выглядит так:

                   A          B             C
Date            
02/02/2007  14.8966   0.289371   0.009984836
05/02/2007  14.8719   0.288368  -0.001659473
06/02/2007  14.9295   0.279869   0.003865595
07/02/2007  15.0035   0.283038   0.004944386
08/02/2007  15.0528   0.277092   0.003280513
09/02/2007  14.7733   0.28663   -0.018742523
12/02/2007  14.6911   0.286458  -0.005579629
13/02/2007  14.996    0.275362   0.020541631
14/02/2007  15.5731   0.253263   0.037761568
 

У меня есть цикл for, в котором я использую для управления временными рядами. Результатом является вызываемая переменная testValue , которую я хотел бы добавить df в новый столбец, вызываемый 'D' по ссылке на строку endpoint (конечная точка — это последовательно увеличивающееся целое число).

 for i in range(buildRange,len(pair_data)-calcRange 1):
    startpoint=i
    endpoint = startpoint calcRange
    Calc_df=df[startpoint:endpoint].copy()
    Calc_df['C']=Calc_df.iloc[-1, Calc_df.columns.get_loc('A')]-Calc_df['B']
    testValue= sum(x for x in Calc_df["C"] if x > 0)
    
    df.loc[endpoint, 'D'] = testValue
    
 

Таким образом, в течение цикла столбец ‘D’ будет накапливаться со значениями testValue. Можно ли ссылаться на строку в фрейме данных, а не на индекс? На данный момент using df.loc[endpoint, 'D'] = testValue создает новый столбец 'D' , но добавляет данные в нижнюю часть фрейма данных, а не в правильную строку. (Я думаю, это потому, что конечная точка является целым числом, а индекс — датой, поэтому он не может найти ссылку, поэтому создает новую в нижней части фрейма данных).

Так, например, если конечная точка начиналась с 4, желаемый результат должен выглядеть так:

               A          B             C             D
Date            
02/02/2007  14.8966   0.289371   0.009984836
05/02/2007  14.8719   0.288368  -0.001659473
06/02/2007  14.9295   0.279869   0.003865595
07/02/2007  15.0035   0.283038   0.004944386    1.36535
08/02/2007  15.0528   0.277092   0.003280513    0.27821
09/02/2007  14.7733   0.28663   -0.018742523    0.25356
12/02/2007  14.6911   0.286458  -0.005579629    2780435
13/02/2007  14.996    0.275362   0.020541631    0.36635
14/02/2007  15.5731   0.253263   0.037761568    0.25368
        :                            :
31/12/2007  15.9364   0.763263   0.047435768    0.24663
 

(Значения в столбце 4 приведены только для иллюстрации и будут корректными, если код был запущен).

Комментарии:

1. Похоже на что-то вроде rolling . Я не могу точно сказать, что вы пытаетесь сделать без конкретных данных. Одно можно сказать наверняка: ваши данные индексируются, Date но вы, похоже, обновляете с df.loc[endpoint, 'D'] помощью where endpoint — целое число. Ваш код будет работать не так, как ожидалось.

2. Спасибо @QuangHoang — есть ли способ ссылаться на строку, а не на индекс строки в фрейме данных?

3. Краткое напоминание об ожиданиях при переполнении стека для технического написания. Благодарности, благодарности, приветствия, подписи и т. Д. Лучше всего опустить.

Ответ №1:

Трудно проверить, что вы пытаетесь сделать. Из вашего кода я предполагаю, что это:

 df['D'] = (df['A'].shift()       # correspond to `Calc_df.iloc[-1, Calc_df.columns.get_loc('A')]`
            .sub( df['B'])       # subtract df['B']
            .mul(df['C'].gt(0))  # only look at `df['C']>0`
            .rolling(4).sum()    # sum the last 4 occurrences
          )
 

Вывод:

                   A         B         C          D
Date                                              
02/02/2007  14.8966  0.289371  0.009985        NaN
05/02/2007  14.8719  0.288368 -0.001659        NaN
06/02/2007  14.9295  0.279869  0.003866        NaN
07/02/2007  15.0035  0.283038  0.004944        NaN
08/02/2007  15.0528  0.277092  0.003281  43.964901
09/02/2007  14.7733  0.286630 -0.018743  43.964901
12/02/2007  14.6911  0.286458 -0.005580  29.372870
13/02/2007  14.9960  0.275362  0.020542  29.142146
14/02/2007  15.5731  0.253263  0.037762  29.158475