Сначала замените значения ниже 0
диагональю NaN
, а затем измените форму на stack
:
np.random.seed(100)
df = pd.DataFrame(np.random.randint(10, size=(5,5)), columns=list('ABCDE')) - 3
print (df)
A B C D E
0 5 5 0 4 4
1 -3 1 -1 2 -1
2 -1 -1 -2 -3 5
3 1 -3 6 3 -1
4 1 -2 2 0 1
df = df.where(df > 0)
np.fill_diagonal(df.values, np.nan)
df = df.stack().reset_index()
df.columns=['idx','col','val']
print (df)
idx col val
0 0 B 5.0
1 0 D 4.0
2 0 E 4.0
3 1 D 2.0
4 2 E 5.0
5 3 A 1.0
6 3 C 6.0
7 4 A 1.0
8 4 C 2.0
Объяснение :
stack
создать MultiIndex Series
:
print (df.stack())
0 B 5.0
D 4.0
E 4.0
1 D 2.0
2 E 5.0
3 A 1.0
C 6.0
4 A 1.0
C 2.0
dtype: float64
А затем reset_index()
создать столбцы из MultiIndex
:
print (df.stack().reset_index())
level_0 level_1 0
0 0 B 5.0
1 0 D 4.0
2 0 E 4.0
3 1 D 2.0
4 2 E 5.0
5 3 A 1.0
6 3 C 6.0
7 4 A 1.0
8 4 C 2.0