Я создал небольшой фрейм данных и хочу умножить 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)
Я пробовал этот код, но он не работает. Если посылки верны, то назовите «начальное», в противном случае переходите к кумулятивному умножению.
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
есть ли способ сделать это, используя yd вместо x?
yd
- это их куча. Вам нужны последовательные мощности .5
на самом деле забудьте про х. Я положил его туда, чтобы образовать y. Мне нужен столбец, скажем 4x1, 1-й элемент равен 1, а остальные три элемента 0,5 предыдущего.
@ user3203275: ммм, такой столбец всего один, и он генерирует именно его. Если вы хотите избежать какого-либо материализованного x
, просто используйте piRS .5 ** (pd.Series(range(len(x))
, но вставьте 4 для len (x), например .5 ** pd.Series(range(4))
.
не могли бы вы объяснить мне немного структуру первого подхода cumprod? это выглядит интересно
@ user3203275 Я рекомендую вам поиграть с ним. Обычно я углубляюсь в объяснение, но это очень простой фрагмент. Вам следует взять первую часть pd.Series(.5, x.index)
и посмотреть, что у вас получится. Затем добавьте cumprod
и посмотрите, что у вас получится. Затем разделите на .5
и посмотрите, что у вас получится. Я говорю это ради вашей пользы. Набрать этот комментарий, вероятно, будет сложнее, чем напечатать объяснение, но я верю, что вам будет лучше.
Вы правы, я уже это сделал и понял структуру. Конечно, чтобы получить полную собственность, нужно время. большое спасибо!
К сожалению, мой запрос изменился на более сложный ... data ['y'] = np.where ((data ['a'] <50) & (data ['b']> 0), data [' initial '], pd.Series (0.99, data [' y ']. index) .cumprod () / 0.99) Я не уверен, можно ли размещать это здесь. Разрешите мне еще раз отредактировать сообщение.
Почему не просто .5 ** (x-1)?