Python 在Pandas数据帧上应用Numpy函数
我有一个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],
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您能在这里帮助我更新部分吗。