使用Python 2.7:所以我有一个名为edge_err
的数据框,如下所示:
# Simplified DF
d = {'model_id': [1, 2, 4, 8, 16], 't_err':[.715130, .236947, .002106, .001043, .000512]}
pd.DataFrame(data=d)
# Slope is the variable I want to compute
model_id t_err slope
0 1 0.715130 0
1 2 0.236947 1.593640
2 4 0.002106 6.813878
3 8 0.001043 1.013115
4 16 0.000512 1.026592
我想计算model_id
和t_err
上每个观测值之间的斜率。目前,我添加slope
列的代码如下:
def slope(x, y):
slope_list = []
for xi in range(0, len(x)-1):
denom = x[xi+1] - x[xi]
num = y[xi+1] - y[xi]
slope = num / denom
slope_list.append(slope)
return slope_list
transformx = [np.log10(1/float(x)) for x in edge_err.model_id.tolist()]
transformy = [np.log10(x) for x in edge_err.t_err.tolist()]
edge_err['slope'] = [0] + slope(transformx, transformy)
由于某种特殊原因,我不得不对这些数字进行变换,这些原因与斜率的计算并不真正相关,因此transformx
和transformy
但是我确信有一种pandas
的方式可以完成此任务。我已经看到其他问题可以解决此问题,但不能完全适合我的情况。如何计算每个点之间的斜率?
第一个观测值应保留在表中,但斜率值为0
或NaN
。
答案 0 :(得分:1)
由于某些原因,对数函数未包含在熊猫中,但与numpy函数一起使用时很简单(高效)。
import pandas as pd
import numpy as np
d = {'model_id': [1, 2, 4, 8, 16], 't_err':[.715130, .236947, .002106, .001043, .000512]}
d = pd.DataFrame(d)
transformx = -d['model_id'].apply(np.log10)
transformy = d['t_err'].apply(np.log10)
denom = transformx.diff()
num = transformy.diff()
slope = (num / denom).fillna(0)
slope
0 0.000000
1 1.593641
2 6.813915
3 1.013766
4 1.026523
dtype: float64
如果NaN足够,则可以直接删除fillna
函数调用。
答案 1 :(得分:1)
您还可以使用assign()在一个链中进行所有操作:
edge_err.assign(transformx = -np.log10(edge_err.model_id)
, transformy = np.log10(edge_err.t_err)) \
.assign(slope = lambda x: (x.transformy.diff())/(x.transformx.diff()))
# model_id t_err transformx transformy slope
#0 1 0.715130 -0.00000 -0.145615 NaN
#1 2 0.236947 -0.30103 -0.625349 1.593641
#2 4 0.002106 -0.60206 -2.676542 6.813915
#3 8 0.001043 -0.90309 -2.981716 1.013766
#4 16 0.000512 -1.20412 -3.290730 1.026523