提问者:小点点

使用理解返回列出列对的数据框


我从类似于这样的相关矩阵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


共2个答案

匿名用户

使用pd. DataFrame.unackreset_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)]