Кумулятивное умножение python pandas

Я создал небольшой фрейм данных и хочу умножить 0,5 на предыдущую строку и так далее.

В:

1
2
3
4

Из:

1
0.5
0.25
0.125

Я пробовал следующее, но не работает должным образом. Он не накопительный и, скажем так, бессрочный.

x = pd.DataFrame([1, 2, 3, 4])
y = np.zeros(x.shape)

y[0] = 1
yd = pd.DataFrame(y)

k =  yd.shift(1) * 0.5

print (k)

Любая идея? Спасибо


2-й более сложный вопрос, основанный на предыдущем выпуске.

data['y'] = np.where((data['a']<50) & (data['b']>0), data['initial'], pd.Series(0.99, data['y'].index).cumprod() / 0.99)

Я пробовал этот код, но он не работает. Если посылки верны, то назовите «начальное», в противном случае переходите к кумулятивному умножению.

2
0
333
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте numpy.power

np.power(.5, x - 1)

       0
0  1.000
1  0.500
2  0.250
3  0.125

Или как @DSM указал (более интуитивно)

.5 ** (x - 1)

       0
0  1.000
1  0.500
2  0.250
3  0.125

С другой стороны, если вам просто нужны строго последовательные степени .5

.5 ** pd.Series(range(len(x)))

0    1.000
1    0.500
2    0.250
3    0.125
dtype: float64

Еще одна альтернатива с cumprod

pd.Series(.5, x.index).cumprod() / .5

0    1.000
1    0.500
2    0.250
3    0.125
dtype: float64

Или

pd.Series({**dict.fromkeys(range(4), .5), **{0: 1}}).cumprod()

0    1.000
1    0.500
2    0.250
3    0.125
dtype: float64

Почему не просто .5 ** (x-1)?

DSM 13.09.2018 20:32

есть ли способ сделать это, используя yd вместо x?

user3203275 13.09.2018 20:36
yd - это их куча. Вам нужны последовательные мощности .5
piRSquared 13.09.2018 20:37

на самом деле забудьте про х. Я положил его туда, чтобы образовать y. Мне нужен столбец, скажем 4x1, 1-й элемент равен 1, а остальные три элемента 0,5 предыдущего.

user3203275 13.09.2018 20:40

@ user3203275: ммм, такой столбец всего один, и он генерирует именно его. Если вы хотите избежать какого-либо материализованного x, просто используйте piRS .5 ** (pd.Series(range(len(x)), но вставьте 4 для len (x), например .5 ** pd.Series(range(4)).

DSM 13.09.2018 20:44

не могли бы вы объяснить мне немного структуру первого подхода cumprod? это выглядит интересно

user3203275 13.09.2018 20:45

@ user3203275 Я рекомендую вам поиграть с ним. Обычно я углубляюсь в объяснение, но это очень простой фрагмент. Вам следует взять первую часть pd.Series(.5, x.index) и посмотреть, что у вас получится. Затем добавьте cumprod и посмотрите, что у вас получится. Затем разделите на .5 и посмотрите, что у вас получится. Я говорю это ради вашей пользы. Набрать этот комментарий, вероятно, будет сложнее, чем напечатать объяснение, но я верю, что вам будет лучше.

piRSquared 13.09.2018 20:49

Вы правы, я уже это сделал и понял структуру. Конечно, чтобы получить полную собственность, нужно время. большое спасибо!

user3203275 13.09.2018 20:54

К сожалению, мой запрос изменился на более сложный ... data ['y'] = np.where ((data ['a'] <50) & (data ['b']> 0), data [' initial '], pd.Series (0.99, data [' y ']. index) .cumprod () / 0.99) Я не уверен, можно ли размещать это здесь. Разрешите мне еще раз отредактировать сообщение.

user3203275 13.09.2018 21:41

Другие вопросы по теме