Подводя итог различия от текущего ряда к предыдущему - PullRequest
0 голосов
/ 19 февраля 2019

Рассчитывая разницу от текущей строки к предыдущей, у меня есть простой набор данных и коды ниже:

import pandas as pd

data = {'Month' : [1,2,3,4,5,6,7,8,9,10,11,12],
'Rainfall': [112,118,132,129,121,135,148,148,136,119,104,118]}

df = pd.DataFrame(data)

Rainfall = df["Rainfall"]

df['Changes'] = Rainfall.shift(-1) - Rainfall

df['Changes'] = df['Changes'].shift(1)

Он показывает изменения (как левая часть рисунка).Однако меня волнует только положительное, отрицательное или нулевое изменение (как в правой части рисунка)

enter image description here

Я пытался добавить IFусловие, но оно дает мне ошибку:

if df['Changes'] > 0:
    df['Changes'] = df['Changes'].shift(1)

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Как правильно это сделать?Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

if условие не работает для pandas.Series.Как только вы создали Changes с помощью df['Changes'] = (Rainfall.shift(-1) - Rainfall) / Rainfall, используйте следующую команду, чтобы вычислить только положительное или отрицательное значение -

df['Changes'] = np.where(df['Changes'] >0, 'positive', 'negative')
df['Changes'] = df['Changes'].shift(1)
0 голосов
/ 19 февраля 2019

Используйте numpy.sign с map по словарю:

d = {1:'Positive', -1:'Negative',0:'Zero'}
df['Changes'] = np.sign(df['Changes'].shift(1)).map(d).fillna('')

print (df)
    Month  Rainfall   Changes
0       1       112        
1       2       118  Positive
2       3       132  Positive
3       4       129  Negative
4       5       121  Negative
5       6       135  Positive
6       7       148  Positive
7       8       148      Zero
8       9       136  Negative
9      10       119  Negative
10     11       104  Negative
11     12       118  Positive

Другое решение с numpy.select:

s = df['Changes'].shift(1)
df['Changes'] = np.select([s < 0, s > 0, s == 0],
                          ['Negative','Positive','Zero'], 
                           default='')

РЕДАКТИРОВАТЬ:

df['Changes'] = df['Changes'].shift(1)
bins = np.arange(-100, 100, step=5)
labels = ['{}-{}'.format(i, j) for i, j in zip(bins[:-1], bins[1:])] 

df['Changes'] = pd.cut(df['Changes'], bins=bins, labels=labels)
print (df)
    Month  Rainfall Changes
0       1       112     NaN
1       2       118     0-5
2       3       132     0-5
3       4       129    -5-0
4       5       121    -5-0
5       6       135     0-5
6       7       148     0-5
7       8       148    -5-0
8       9       136    -5-0
9      10       119    -5-0
10     11       104    -5-0
11     12       118     0-5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...