Python Pandas обновляет значение в строке, используя значение строки прецедента - PullRequest
0 голосов
/ 01 ноября 2019

Я должен использовать значение строки прецедента для расчета нового значения. У меня много строк, я не хочу использовать цикл, потому что он занимает много времени, я пробовал с помощью shift, но я думаю, что это мне не помогает, или я, вероятно, не знаю, как его использовать.

здесь, небольшой пример того, что я хочу сделать.

У меня есть фрейм данных

df = pd.DataFrame({'A': [4,2,3,2], 'B': [2, 3,4,5]})  
In [273]: df                                                                                   
Out[273]:  
   A  B   
0  4  2  
1  2  3  
2  3  4 
3  2  5  

Я хочу создать новый столбец 'C':

  • Первое значение C является первым значением A
  • Второе значение C, принимает первое значение C и добавляет B (второе),
  • Третье значение C, принимает второе значениеC и добавить B (третье) Чтобы получить что-то вроде (конечный результат)

</p>

<code>In [273]: df                                                                                   
Out[273]: 
   A  B    C
0  4  2  4.0
1  2  3  7.0
2  3  4  11.0
3  2  5  16.0
</code>

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

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 01 ноября 2019

Вы ищете кумулятивное деление, поэтому обратный кумулятивному методу prod, вы можете получить его с помощью метода .cumprod().

Единственный прием, который вы хотите начать с первого значения столбцаВместо этого или B, поэтому вам нужно умножить на первое значение A и на первое значение B

df['C'] =  1/df['B'].cumprod()*df.loc[0,'B'] * df.loc[0,'A']

#   A   B   C
#0  4   2   4.000000
#1  2   3   1.333333
#2  3   4   0.333333
#3  2   5   0.066667
1 голос
/ 01 ноября 2019

Используйте Series.where + Series.cumprod, чтобы получить кумулятивное деление:

df['C']=df['A'].where(df.index==0, 1/df['B']).cumprod()
print(df)

   A  B         C
0  4  2  4.000000
1  2  3  1.333333
2  3  4  0.333333
3  2  5  0.066667
1 голос
/ 01 ноября 2019

Чтобы добавить к существующим ответам: если эффективность важна, я думаю, что накопление имеет тенденцию быть быстрее (хотя это добавляет другую зависимость):

from itertools import accumulate
df['C'] = df['A'].values[0] + list(accumulate(np.append(0, df['B'].values[1:])))
...