我有一個這樣的熊貓資料框。其中索引是 pd.DatetimeIndex 列是時間序列。
| x_1 | x_2 | x_3 | |
|---|---|---|---|
| 2020-08-17 | 133.23 | 2457.45 | -4676 |
| 2020-08-18 | -982 | -6354.56 | -245.657 |
| 2020-08-19 | 5678.642 | 245.2786 | 2461.785 |
| 2020-08-20 | -2394 | 154.34 | -735.653 |
| 2020-08-20 | 236 | -8876 | -698.245 |
我需要計算所有列彼此之間的歐幾里得距離。即,(x_1 - x_2), (x_1 - x_3), (x_2 - x_3),并回傳這樣的方形資料框:(請注意,此表中的值只是一個示例,而不是歐幾里得的實際結果距離)
| x_1 | x_2 | x_3 | |
|---|---|---|---|
| x_1 | 0 | 123 | 456 |
| x_2 | 123 | 0 | 789 |
| x_3 | 456 | 789 | 0 |
我嘗試了這個資源,但我不知道如何傳遞我的 df 的列。如果理解正確,該示例將行作為系列傳遞以從中計算 ED。
uj5u.com熱心網友回復:
實作這一目標的明確方法是:
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)
uj5u.com熱心網友回復:
以下代碼適用于任意數量的列。
設定
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],
}
)
解決方案
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
為什么這種方法有效超出了我的意愿,并且需要強大的數學背景。您需要決定什么對您更重要:速度,還是可讀性/可理解性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/336092.html
