简体   繁体   English

熊猫pct从初始值变化

[英]Pandas pct change from initial value

I want to find the pct_change of Dew_P Temp (C) from the initial value of -3.9. 我想从初始值-3.9找到Dew_P Temp (C)Dew_P Temp (C) I want the pct_change in a new column. 我想在新专栏中使用p​​ct_change。

Source here: 来源:

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

I have tried variations of this for loop (even going as far as adding an index shown here) but to no avail: 我已尝试过for循环的变体(甚至可以添加此处显示的索引),但无济于事:

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

I think the problem is the weather['pct_diff'] , it doesn't take the new it takes the last value of the data frame and subtracts it from old 我认为问题是weather['pct_diff'] ,它不需要new的数据帧的最后一个值并从old减去它

So its always (2.1-3.9)/3.9*100 thus my percent change is always -46%. 所以它总是(2.1-3.9)/3.9*100因此我的百分比变化总是-46%。

The end result I want is this: 我想要的最终结果是:

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%  

Any ideas? 有任何想法吗? Thanks! 谢谢!

You can use iat to access the scalar value (eg iat[0] accesses the first value in the series). 您可以使用iat访问标量值(例如, iat[0]访问序列中的第一个值)。

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

IIUC you can do it this way: 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

I find this more graceful 我发现这更优雅

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

To get your expected output with absolute values 使用绝对值获得预期输出

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

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM