我有一个像这样的pandas数据框架。索引是pd。DatetimeIndex和列都是时间序列。
x_3-4676 -982-6354.56 -245.6572020-08-19 5678.642 245.2786 2461.785 -2394154.34 -735.653-8876 -698.245
实现这一点的显式方法是:
from itertools import combinations
import numpy as np
dist_df = pd.DataFrame(index=df.columns, columns=df.columns)
for col_a, col_b in combinations(df.columns, 2):
dist = np.linalg.norm(df[col_a] - df[col_b])
dist_df.loc[col_a, col_b] = dist
dist_df.loc[col_b, col_a] = dist
print(dist_df)
输出x_1 x_2 x_3
x_1 NaN 12381.858429 6135.306973
x_2 12381.858429 NaN 12680.121047
x_3 6135.306973 12680.121047 NaN
如果您想要0
而不是NaN
,请使用DataFrame.fillna
:
dist_df.fillna(0, inplace=True)
对于任意数量的列,下面的代码都可以工作。
设置>df = pd.DataFrame(
{
"x1":[133.23, -982, 5678.642, -2394, 236],
"x2":[2457.45, -6354.56, 245.2786, 154.34, -8876],
"x3":[-4676, -245.657, 2461.785, -735.653, 698.245],
}
)
<<p>解决方案/strong>import numpy as np
aux = np.broadcast_to(df.values, (df.shape[1], *df.shape))
result = np.sqrt(np.square(aux - aux.transpose()).sum(axis=1))
result
是numpy.array
如果你愿意,你可以像这样把它封装在一个数据框架中
pd.DataFrame(result, columns=df.columns, index=df.columns)
x1 x2 x3
x1 0.000000 12381.858429 6081.352512
x2 12381.858429 0.000000 13622.626775
x3 6081.352512 13622.626775 0.000000
为什么这种方法有效超出了我愿意进入,需要一个强大的数学背景。你需要决定哪个对你更重要:速度,还是可读性/可理解性。