如何解决数据框行的快速笛卡尔总和
我在3个轴(x,y,z)上有两个错误数据框:
df1 = pd.DataFrame([[0,1,2],[-1,1],[-2,3]],columns = ['x','y','z'])
df2 = pd.DataFrame([[1,3],[1,'z'])
我正在寻找一种快速的方法来找到两个数据帧每一行的平方的笛卡尔求和。
编辑我当前的解决方案:
cartesian_sum = list(np.sum(list(tup),axis = 0).tolist()
for tup in itertools.product( (df1**2).to_numpy().tolist(),(df2**2).to_numpy().tolist() ) )
cartesian_sum
>>>
[[1,2,13],8],[2,10],5],[5,18],18]]
太慢(约2.4毫秒;与仅运行约8-10毫秒的熊猫解决方案相比)。
这与related question (link here)类似,但是使用itertools
的过程太慢了。在Python中有更快的方法吗?
解决方法
我认为您首先需要交叉连接,删除列a
,平方,然后在第一级将列转换为MultiIndex
和sum
:
df = df1.assign(a=1).merge(df2.assign(a=1),on='a').drop('a',axis=1) ** 2
df.columns = df.columns.str.split('_',expand=True)
df = df.sum(level=0,axis=1)
print (df)
x y z
0 1 2 13
1 1 1 8
2 1 1 13
3 2 1 10
4 2 0 5
5 2 0 10
6 5 1 18
7 5 0 13
8 5 0 18
详细信息:
print (df1.assign(a=1).merge(df2.assign(a=1),on='a'))
x_x y_x z_x a x_y y_y z_y
0 0 1 2 1 1 1 3
1 0 1 2 1 1 0 2
2 0 1 2 1 1 0 3
3 -1 0 1 1 1 1 3
4 -1 0 1 1 1 0 2
5 -1 0 1 1 1 0 3
6 -2 0 3 1 1 1 3
7 -2 0 3 1 1 0 2
8 -2 0 3 1 1 0 3
提高性能的一个主意:
#https://stackoverflow.com/a/53699013/2901002
def cartesian_product_simplified_changed(left,right):
la,lb = len(left),len(right)
ia2,ib2 = np.broadcast_arrays(*np.ogrid[:la,:lb])
a = np.column_stack([left.values[ia2.ravel()] ** 2,right.values[ib2.ravel()] ** 2])
a = a[:,:la] + a[:,la:]
return a
a = cartesian_product_simplified_changed(df1,df2)
print (a)
[[ 1 2 13]
[ 1 1 8]
[ 1 1 13]
[ 2 1 10]
[ 2 0 5]
[ 2 0 10]
[ 5 1 18]
[ 5 0 13]
[ 5 0 18]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。