Python 在Pandas数据帧上应用Numpy函数

Python 在Pandas数据帧上应用Numpy函数,python,arrays,pandas,numpy,dataframe,Python,Arrays,Pandas,Numpy,Dataframe,我有一个numpy数组,如下所示: array([[1, 2], [3, 4], [5, 6], [7, 8]]) 该数组称为myArray,我对2D数组执行了两个索引操作,并得到以下结果: In[1]: a2 = myArray[1:] a2 Out[1]:array([[3, 4], [5, 6],

我有一个numpy数组,如下所示:

     array([[1, 2],
            [3, 4],
            [5, 6],
            [7, 8]])
该数组称为myArray,我对2D数组执行了两个索引操作,并得到以下结果:

     In[1]: a2 = myArray[1:]
            a2

     Out[1]:array([[3, 4],
                   [5, 6],
                   [7, 8]])


     In[2]: a1 = myArray[:-1]
            a1

     Out[2]:array([[1, 2],
                   [3, 4],
                   [5, 6]])
     In[]: theta = np.arccos((a1*a2).sum(axis= 1)/(np.sqrt((a1**2).sum(axis= 1)*(a2**2).sum(axis= 1))))
           theta
     Out[]: array([ 0.1798535 ,  0.05123717,  0.02409172])
现在,我执行numpy函数以获得以下结果:

     In[1]: a2 = myArray[1:]
            a2

     Out[1]:array([[3, 4],
                   [5, 6],
                   [7, 8]])


     In[2]: a1 = myArray[:-1]
            a1

     Out[2]:array([[1, 2],
                   [3, 4],
                   [5, 6]])
     In[]: theta = np.arccos((a1*a2).sum(axis= 1)/(np.sqrt((a1**2).sum(axis= 1)*(a2**2).sum(axis= 1))))
           theta
     Out[]: array([ 0.1798535 ,  0.05123717,  0.02409172])
我在等效数据帧上执行相同的操作序列:

    In[]: df = pd.DataFrame(data = myArray, columns = ["x", "y"])
          df
    Out[]: 
         x    y
      0  1    2
      1  3    4
      3  5    6
      4  7    8

   In[]: b2 = df[["x", "y"]].iloc[1:]
   Out[]: b2
            x   y
       1    3   4
       2    5   6
       3    7   8

   In[]: b1 = df[["x", "y"]].iloc[:-1]
         b1
   Out[]: 
            x   y
       0    1   2
       1    3   4
       2    5   6
但现在,当我试图得到数据帧的θ时,我只得到0和NaN值

      In[]: theta2 = np.arccos((b1*b2).sum(axis= 1)/(np.sqrt((b1**2).sum(axis= 1)*(b2**2).sum(axis= 1))))
            theta2
      Out[]: 
            0    NaN
            1    0.0
            2    0.0
            3    NaN
            dtype: float64
这是我将numpy函数应用于索引数据帧的正确方法吗?当将θ应用于数据帧时,如何获得相同的结果

更新

如下所示,使用b1.values和b2.values是可行的,但现在当我构造一个函数并将其应用于df时,我不断得到值错误:

       def theta(group):
             b2 = df[["x", "y"]].iloc[1:]
             b1 = df[["x", "y"]].iloc[:-1]

             t = np.arccos((b1.values*b2.values).sum(axis= 1)/
              (np.sqrt((b1.values**2).sum(axis= 1)*(b2.values**2).sum(axis= 1))))

       return t

       df2 = df.apply(theta)
这会产生错误

       ValueError: Shape of passed values is (2, 3), indices imply (2, 4)
请让我知道我错在哪里


提前感谢。

b1和b2的索引未对齐

如果您这样做:

b2.index=b1.index

np.arccos((b1*b2).sum(axis= 1)/(np.sqrt((b1**2).sum(axis= 1)*(b2**2).sum(axis= 1))))
应输出:

Out[75]: 
0    0.179853
1    0.051237
2    0.024092
dtype: float64
如果不想更改索引,可以显式调用df.values:

np.arccos((b1.values*b2.values).sum(axis= 1)/(np.sqrt((b1.values**2).sum(axis= 1)*(b2.values**2).sum(axis= 1))))

b1和b2的索引未对齐

如果您这样做:

b2.index=b1.index

np.arccos((b1*b2).sum(axis= 1)/(np.sqrt((b1**2).sum(axis= 1)*(b2**2).sum(axis= 1))))
应输出:

Out[75]: 
0    0.179853
1    0.051237
2    0.024092
dtype: float64
如果不想更改索引,可以显式调用df.values:

np.arccos((b1.values*b2.values).sum(axis= 1)/(np.sqrt((b1.values**2).sum(axis= 1)*(b2.values**2).sum(axis= 1))))

非常感谢,这正是我所期望的。@Liza,你能在更新中显示你期望的输出吗?我很抱歉这么晚才回复。我希望得到与你之前帮助过我的答案相同的答案,即数组([0.1798535,0.05123717,0.02409172])。我正在应用相同的操作,但是已经创建了一个函数theta(),并在其中实现了它。df.apply将对数据帧应用一个按行或按列的函数。您可以简单地调用θ(“”),它将为您提供相同的输出。顺便说一句,group参数不是必需的。非常感谢,这正是我所期望的。@Liza,你能在更新中显示你期望的输出吗?很抱歉,回复太晚了。我希望得到与你之前帮助过我的答案相同的答案,即数组([0.1798535,0.05123717,0.02409172])。我正在应用相同的操作,但是已经创建了一个函数theta(),并在其中实现了它。df.apply将对数据帧应用一个按行或按列的函数。您可以简单地调用θ(“”),它将为您提供相同的输出。顺便说一句,group参数不是必需的。@piRSquared您能在这里帮助我更新部分吗?@piRSquared您能在这里帮助我更新部分吗。