bugfix> python > 投稿

xおよびy座標のリストを持つデータフレームがあります。私はそれで統計線形回帰関数を実行しようとしていますが、それは私に全体のnanを与えています。

データフレームは次のようになります

 x1  x2  x3  x4  y1  y2  y3  y4 
0 6   5   4   1   2   3   7   6 
1 5   5   4   9   4   3   8   2

私のコードは次のようになります:

#slope,_,_,_,_=stats.linregress([-7,55,12,-38],[5,40,-10,-20]) #tested:works 
df.loc[:,'slope1'] = df[['x1','x2','y1','y2']].apply(lambda x: stats.linregress([x[0],x[1]],[x[2],x[3]])[0])
df.loc[:,'slope2'] = df[['x3','x4','y3','y4']].apply(lambda x: stats.linregress([x[0],x[1]],[x[2],x[3]])[0])
# not working until linregress above works:
#df['angle'] = np.arctan((df['slope1'] - df['slope2']) / (1 + (df['slope1'] * df['slope2'])))

これにより以下が生成されます。

 x1  x2  x3  x4  y1  y2  y3  y4  slope1  slope2 
0 6   5   4   1   2   3   7   6   NaN     NaN  
1 5   5   4   9   4   3   8   2   NaN     NaN

関数をデータフレーム列に適用して、nan以外のものを与えるにはどうすればよいですか?

回答 1 件
  • axis=1 を定義する必要があると思う  行ごとのプロセス関数の場合:

    from scipy import stats
    f = lambda x: stats.linregress([x[0],x[1]],[x[2],x[3]])[0]
    df['slope1'] = df[['x1','x2','y1','y2']].apply(f, axis=1)
    df['slope2'] = df[['x3','x4','y3','y4']].apply(f, axis=1)
    df['angle'] = np.arctan((df['slope1'] - df['slope2']) / (1 + (df['slope1'] * df['slope2'])))
    print (df)
       x1  x2  x3  x4  y1  y2  y3  y4  slope1    slope2     angle
    0   6   5   4   1   2   3   7   6    -1.0  0.333333 -1.107149
    1   5   5   4   9   4   3   8   2     NaN -1.200000       NaN
    
    

あなたの答え