繁体   English   中英

pd.Series 到 pd.DataFrame,同时将每个元素与其他元素相乘

[英]pd.Series to pd.DataFrame while multiplying each element with each other element

假设我有一个形式的向量| a | b | c | d | | a | b | c | d | , 例如

vec = pd.Series([0.3,0.2,0.2,0.3])

构建以下形式的pd.DataFrame的快速而优雅的方法是什么:

| a*a | a*b | a*c | a*d |
| b*a | b*b | b*c | b*d |
| c*a | c*b | c*c | c*d |
| d*a | d*b | d*c | d*d |

一种选择是使用dot

fr = vec.to_frame()
out = fr.dot(fr.T)

Output:

      0     1     2     3
0  0.09  0.06  0.06  0.09
1  0.06  0.04  0.04  0.06
2  0.06  0.04  0.04  0.06
3  0.09  0.06  0.06  0.09

使用 numpy 广播:

vec = pd.Series([0.3,0.2,0.2,0.3])

a = vec.to_numpy()

df = pd.DataFrame(a * a[:, None], index=vec.index, columns=vec.index)
print (df)
      0     1     2     3
0  0.09  0.06  0.06  0.09
1  0.06  0.04  0.04  0.06
2  0.06  0.04  0.04  0.06
3  0.09  0.06  0.06  0.09

或者numpy.outer

df = pd.DataFrame(np.outer(vec, vec), index=vec.index, columns=vec.index)
print (df)
      0     1     2     3
0  0.09  0.06  0.06  0.09
1  0.06  0.04  0.04  0.06
2  0.06  0.04  0.04  0.06
3  0.09  0.06  0.06  0.09

性能(如果像评论中提到的@enke 一样重要):

np.random.seed(2022)
vec = pd.Series(np.random.rand(10000))

print (vec)


In [39]: %%timeit
    ...: fr = vec.to_frame()
    ...: out = fr.dot(fr.T)
    ...: 
386 ms ± 13.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [40]: %%timeit
    ...: pd.DataFrame(np.outer(vec, vec), index=vec.index, columns=vec.index)
    ...: 
    ...: 
351 ms ± 2.62 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [41]: %%timeit
    ...: a = vec.to_numpy()
    ...: 
    ...: df = pd.DataFrame(a * a[:, None], index=vec.index, columns=vec.index)
    ...: 
293 ms ± 4.22 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM