2016-09-13 62 views
5

我想從初始值-3.9找到Dew_P Temp (C)的pct_change。我希望在新列中使用pct_change。熊貓pct從初始值變化

來源的位置:

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減去它

所以它的a (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

IMO讓你期望的輸出,您的解決方案要好得多! – MaxU

+0

這是一個非常優雅的解決方案...我想知道是否有一個爲什麼要做for循環,因爲這對我來說最合適。 – dyao

+0

我同意,這是最成功的 – 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