2017-09-04 6 views
1

pandas.DataFrameには2つの列、xyがあります。当初、xはある範囲に均一に分布しています。 yは、y = some_function(x)と計算されます。パンダ:出力の差が大きい新しいサンプルを追加します

次に、yの値の相違点を確認し、ある値を超えている場合は、対応する2つの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

、我々がそこに1 diffを避けることができるようだし、それはそれを少し簡単になります。 、パンダのバージョンに変換するので、同様

a = data.values 
mask = np.abs(np.diff(a[:,1])) > 0.1 
out_arr = ((a[1:,0] + a[:-1,0])/2.0)[mask] 

- - 、numpyのバージョンにつながるので、同様

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 
関連する問題