我怎樣才能轉換對稱矩陣:
A B C D
A 1 2 3 4
B 2 1 2 3
C 3 2 1 2
D 4 3 2 1
進入鄰接矩陣?:
A A 1
A B 2
A C 3
A D 4
B A 3
B B 1
B C 2
B D 3
C A 3
C C 1
C D 2
D A 4
D B 3
D C 2
D D 1
有什么功能嗎?提前致謝)
uj5u.com熱心網友回復:
假設一個 pandas 資料框作為輸入,您可以使用 numpy 來獲取triu_indices:
import pandas as pd
import numpy as np
l = [[1, 2, 3, 4], [2, 1, 2, 3], [3, 2, 1, 2], [4, 3, 2, 1]]
df = pd.DataFrame(l, index=list('ABCD'), columns=list('ABCD'))
# A B C D
# A 1 2 3 4
# B 2 1 2 3
# C 3 2 1 2
# D 4 3 2 1
a = df.to_numpy()
x,y = np.triu_indices(len(df))
out = pd.DataFrame({'x': df.index[x], 'y': df.columns[y], 'value': a[x,y]})
輸出:
x y value
0 A A 1
1 A B 2
2 A C 3
3 A D 4
4 B B 1
5 B C 2
6 B D 3
7 C C 1
8 C D 2
9 D D 1
所有組合
df.reset_index().melt('index', var_name='column')
輸出:
index column value
0 A A 1
1 B A 2
2 C A 3
3 D A 4
4 A B 2
5 B B 1
6 C B 2
7 D B 3
8 A C 3
9 B C 2
10 C C 1
11 D C 2
12 A D 4
13 B D 3
14 C D 2
15 D D 1
或者,對于不同的順序:
df.stack().rename_axis(['index', 'columns']).reset_index(name='value')
輸出:
index columns value
0 A A 1
1 A B 2
2 A C 3
3 A D 4
4 B A 2
5 B B 1
6 B C 2
7 B D 3
8 C A 3
9 C B 2
10 C C 1
11 C D 2
12 D A 4
13 D B 3
14 D C 2
15 D D 1
uj5u.com熱心網友回復:
另一種解決方案是使用pandas.stack()和重置索引值:
import pandas as pd
import numpy as np
l = [[1, 2, 3, 4], [2, 1, 2, 3], [3, 2, 1, 2], [4, 3, 2, 1]]
df = pd.DataFrame(l, index=list('ABCD'), columns=list('ABCD'))
# A B C D
# A 1 2 3 4
# B 2 1 2 3
# C 3 2 1 2
# D 4 3 2 1
df = df.stack().reset_index()
df['ordered-name'] = df.apply(lambda x: '-'.join(sorted([x['level_0'],x['level_1']])),axis=1)
df = df.drop_duplicates(['ordered-name'])
df.drop(['ordered-name'], axis=1, inplace=True)
# level_0 level_1 0
# 0 A A 1
# 1 A B 2
# 2 A C 3
# 3 A D 4
# 4 B B 1
# 5 B C 2
# 6 B D 3
# 7 C C 1
# 8 C D 2
# 9 D D 1
您可以根據需要更改列的名稱。
uj5u.com熱心網友回復:
它實際上已經是一個鄰接矩陣(就像您將它用于有向圖一樣)。我猜您正在尋找鄰接串列或考慮您的示例鄰接圖(對于無向圖)。我不確定是否有用于這種轉換的內置函式(假設您正在使用 pandas 資料框并考慮使用的標簽)。最簡單的方法是讀取矩陣的頂部(或底部)三角形,它不應該在回圈中占用太多迭代,然后以這種方式構造它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474526.html
標籤:Python python-3.x 数据框 功能
下一篇:在資料框中創建自定義分位數?
