2016-09-13 2 views
5

Я хочу найти pct_change Dew_P Temp (C) от начального значения -3.9. Я хочу pct_change в новом столбце.Pandas pct change from initial value

Источник здесь:

weather = pd.read_csv('https://raw.githubusercontent.com/jvns/pandas-cookbook/master/data/weather_2012.csv') 
weather[weather.columns[:4]].head() 


Date/Time  Temp (C) Dew_P Temp (C) Rel Hum (%) 
0 2012-01-01 -1.8  -3.9    86 
1 2012-01-01 -1.8  -3.7    87 
2 2012-01-01 -1.8  -3.4    89 
3 2012-01-01 -1.5  -3.2    88 
4 2012-01-01 -1.5  -3.3    88 

Я попытался вариации этого для цикла (даже доходя до добавления индекса, показанный здесь), но безрезультатно:

for index, dew_point in weather['Dew_P Temp (C)'].iteritems(): 
    new = weather['Dew_P Temp (C)'][index] 
    old = weather['Dew_P Temp (C)'][0] 
    pct_diff = (new-old)/old*100 
    weather['pct_diff'] = pct_diff 

Я думаю, что проблема является weather['pct_diff'], он не принимает new, он принимает последнее значение кадра данных и вычитает его из old

Таким образом, его (2.1-3.9) /3.9*100, таким образом, мое процентное изменение всегда -46%.

Конечный результат я хочу это:

Date/Time  Temp (C) Dew_P Temp (C) Rel Hum (%) pct_diff 
0 2012-01-01 -1.8  -3.9    86   0.00% 
1 2012-01-01 -1.8  -3.7    87   5.12% 
2 2012-01-01 -1.8  -3.4    89   12.82% 

Любые идеи? Благодаря!

ответ

6

Вы можете использовать iat для доступа к скаляру (например, iat[0] обращается к первому значению в серии).

df = weather 
df['pct_diff'] = df['Dew_P Temp (C)']/df['Dew_P Temp (C)'].iat[0] - 1 
+0

ИМО, ваше решение гораздо лучше! – MaxU

+0

Это действительно изящное решение ... Мне интересно, есть ли для этого почему-то с циклом for, потому что это имеет для меня большую ценность. – dyao

+0

Я согласен, это наиболее succint – piRSquared

4

IIUC вы можете сделать это следующим образом:

In [88]: ((weather['Dew Point Temp (C)'] - weather.ix[0, 'Dew Point Temp (C)']).abs()/weather.ix[0, 'Dew Point Temp (C)']).abs() * 100 
Out[88]: 
0   0.000000 
1   5.128205 
2  12.820513 
3  17.948718 
4  15.384615 
5  15.384615 
6  20.512821 
7   7.692308 
8   7.692308 
9  20.512821 
2

Я нахожу это более изящным

weather['Dew_P Temp (C)'].pct_change().fillna(0).add(1).cumprod().sub(1) 

0 0.000000 
1 -0.051282 
2 -0.128205 
3 -0.179487 
4 -0.153846 
Name: Dew_P Temp (C), dtype: float64 

Чтобы получить ожидаемый результат с абсолютными значениями

weather['pct_diff'] = weather['Dew_P Temp (C)'].pct_change().fillna(0).add(1).cumprod().sub(1).abs() 
weather 

enter image description here