熊猫:添加输出差异很大的新样本

时间:2017-09-04 09:53:50

标签: python pandas numpy

我有一个pandas.DataFrame,其中有两列,xy。最初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

1 个答案:

答案 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