我从类似于这样的相关矩阵DataFrame开始:
x y z
x 1.0 0.4 0.25
y 0.2 1.0 -0.44
z -0.3 -0.3 1.0
我想知道如何创建一个新的DataFrame,它将存储所有列对及其相应的相关值,例如:['列名称1','列名称2','相关值']。
示例行:[x, y,0.2]
有没有一种方法可以通过理解来做到这一点,同时确保没有任何对被包含两次,并且等于1的相关对被排除在外?
类似于[[x, y,df.loc[x,y]]在df.列中用于x在df.列中用于y
使用pd. DataFrame.unack
和reset_index
:
print(df)
x y z
x 1.0 0.4 0.25
y 0.2 1.0 -0.44
z -0.3 -0.3 1.00
df.unstack().reset_index()
level_0 level_1 0
0 x x 1.00
1 x y 0.20
2 x z -0.30
3 y x 0.40
4 y y 1.00
5 y z -0.30
6 z x 0.25
7 z y -0.44
8 z z 1.00
采用熊猫相关矩阵
import numpy as np
import pandas as pd
rs = np.random.RandomState(0)
df = pd.DataFrame(rs.rand(10, 10))
# df
corr = df.corr()
# corr
result = [(idx, col, corr[col].loc[idx])
for idx in corr.index
for col in corr.columns]
print(result)
对于你的例子,
from io import StringIO
from pprint import pprint
import pandas as pd
csv = """
x y z
x 1.0 0.4 0.25
y 0.2 1.0 -0.44
z -0.3 -0.3 1.0
"""
df = pd.read_csv(StringIO(csv), sep=r"\s+")
print(df)
result = [(idx, col, df[col].loc[idx]) for idx in df.index for col in df.columns]
pprint(result)
输出
x y z
x 1.0 0.4 0.25
y 0.2 1.0 -0.44
z -0.3 -0.3 1.00
[('x', 'x', 1.0),
('x', 'y', 0.4),
('x', 'z', 0.25),
('y', 'x', 0.2),
('y', 'y', 1.0),
('y', 'z', -0.44),
('z', 'x', -0.3),
('z', 'y', -0.3),
('z', 'z', 1.0)]