【问题标题】:Applying Numpy functions on Pandas data frame在 Pandas 数据框上应用 Numpy 函数
【发布时间】:2017-05-08 05:52:59
【问题描述】:

我有一个如下的 numpy 数组:

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

数组名为myArray,我对二维数组进行两次索引操作,得到如下结果:

     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]])

现在,我执行 numpy 函数得到以下结果:

     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

但现在当我尝试获取数据框的 theta 时,我只得到 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 函数应用于索引数据帧是否正确?将其应用于数据框时,我应该如何获得与 theta 相同的结果?

更新

如下所示,使用 b1.values 和 b2.values 有效,但现在当我构造函数并将其应用于 df 时,我不断收到 value 错误:

       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

       ValueError: Shape of passed values is (2, 3), indices imply (2, 4)

请让我知道我错在哪里。

提前致谢。

【问题讨论】:

  • @piRSquared 你能帮我解决这里的 UPDATE 部分吗?

标签: python arrays pandas numpy dataframe


【解决方案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 将按行或按列将函数应用于数据帧。您可以简单地调用 theta('') ,这将为您提供相同的输出。顺便说一句,group 参数不是必需的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-16
  • 2017-10-05
  • 2016-06-30
  • 2018-03-13
  • 1970-01-01
相关资源
最近更新 更多