我有一个pandas.DataFrame
,其中有两列,x
和y
。最初x
均匀分布在一个范围内。 y
计算为y = some_function(x)
。
现在我想看看y
的后续值的差异,如果超出某个值,我想在相应的两个x值之间添加更多的采样点。 x_new = (x1 + x2)/2.0
我为此目的写了一个小函数,但是我有一个简单的方法吗?
def dense1(data):
data = data.sort_values(by='x')
dy = data['y'].diff()
dx = data['x'].diff()
i = np.abs(dy) > 0.1
new_x = data['x'][i] - dx[i]/2.0
return new_x
答案 0 :(得分:1)
仔细观察后,似乎我们可以避免一个diff
,这样可以简化它。
这导致NumPy版本,如此 -
a = data.values
mask = np.abs(np.diff(a[:,1])) > 0.1
out_arr = ((a[1:,0] + a[:-1,0])/2.0)[mask]
转换为熊猫版本,如此 -
mask = data['y'].diff().abs() > 0.1
out = ((data.x.shift(1) + data.x)/2.0)[mask]
示例运行 -
In [471]: np.random.seed(0)
In [472]: data = pd.DataFrame(np.random.rand(5,2), columns=(('x','y')))
In [473]: data = data.sort_values(by='x')
...: dy = data['y'].diff()
...: dx = data['x'].diff()
...: i = np.abs(dy) > 0.1
...: new_x = data['x'][i] - dx[i]/2.0
...:
In [474]: new_x
Out[474]:
3 0.430621
0 0.493200
1 0.575788
4 0.783213
Name: x, dtype: float64
In [476]: mask = data['y'].diff().abs() > 0.1
...: out = ((data.x.shift(1) + data.x)/2.0)[mask]
...:
In [477]: out
Out[477]:
3 0.430621
0 0.493200
1 0.575788
4 0.783213
Name: x, dtype: float64