Python 使用列的值进行热图关联?

Python 使用列的值进行热图关联?,python,heatmap,correlation,Python,Heatmap,Correlation,假设我有以下美国各州的重复观测数据,这些数据具有一定的价值: US_State Value Alabama 1 Alabama 10 Alabama 9 Michigan 8 Michigan 9 Michigan 2 ... 如何为所有美国各州组合之间的值生成成对关联?我尝试了一些不同的方法(pivot、groupby等),但我似乎无法找到正确的方法 理想的输出如下所示: Alabama Michigan ... Alabama 1

假设我有以下美国各州的重复观测数据,这些数据具有一定的价值:

US_State Value
Alabama  1
Alabama  10
Alabama  9
Michigan 8
Michigan 9
Michigan 2
...
如何为所有美国各州组合之间的值生成成对关联?我尝试了一些不同的方法(pivot、groupby等),但我似乎无法找到正确的方法

理想的输出如下所示:

          Alabama   Michigan    ...
Alabama      1          0.5
Michigan     0.5        1
...

有一种方法可以最大限度地利用熊猫,但这只是在假设输入数据集中的每个状态都有相同数量的观测值的情况下进行的,否则相关系数就没有意义,结果会变得有点古怪

import pandas as pd

df = pd.DataFrame()
df['US_State'] = ["Alabama", "Alabama", "Alabama", "Michigan", "Michigan", "Michigan", "Oregon", "Oregon", "Oregon"]
df['Value'] = [1, 10, 9, 8, 9, 2, 6, 1, 2]

pd.DataFrame(df.groupby("US_State")['Value'].apply(lambda x: list(x))).T.apply(lambda x: pd.Series(*x), axis=0).corr()
这导致了

US_State   Alabama  Michigan    Oregon
US_State                              
Alabama   1.000000 -0.285578 -0.996078
Michigan -0.285578  1.000000  0.199667
Oregon   -0.996078  0.199667  1.000000

代码的基本功能是将每个状态的数据收集到单个单元格中作为列表,将数据帧转换为状态列,然后将收集到的列表数据单元格扩展到每个状态的数据帧行中。然后您可以调用pandas dataframe的标准
corr()
方法。

pandas dataframe具有内置的相关矩阵函数。您需要以某种方式将数据放入一个数据帧(获取numpy对象、普通dict(如图所示)等)

从导入数据帧
数据={'AL':[1,10,9],
"MI":[8,9,2],,
‘CO’:[11,5,17]
}
df=数据帧(数据)
corrMatrix=df.corr()
打印(corrMatrix)
#可选热图
进口seaborn作为sn
序列号热图(corrMatrix,annot=True,cmap='coolwarm')

这真是个好答案!我发誓我在各个方面都像这个小部件一样击中。我实际上是在写一个基于组合的手动循环子集,计算相关性,并在得到答案时将其存储为矩阵。太优雅了!如果您不介意我问-这部分pd.Series(*x),axis=0在做什么(特别是(*x)?谢谢,没问题。星号基本上意味着将列表中的所有值作为输入参数,请看这里。在本例中,实际上不需要tbh,等效的方法是编写
pd.Series(x[0])
,因为只有一个参数。因为lambda中的输入参数
x
基本上是一个类似列表的列表,我们只需要它是一个列表,星号就可以了。啊,太棒了!感谢您的解释和链接:Dthanks的快速响应,这是我理解它应该做的,但我无法得到我的答案数据看起来像您的df。当我尝试透视-df.pivot(columns='US_State',values='Value')时,我得到一堆NaN(而不是它们都有相同的行数。我是否缺少索引?您可以添加一个索引“index”作为组中的秩:
df2['index']=df2.groupby('State')['Value'].rank())
Then
df2.pivot(columns='State',values='Value',index='index')
应该可以工作,但是获取“索引包含重复的条目,无法重塑”。可能是我的数据存在特定问题,无法概括!所以我会继续关注它-感谢您的回答:)
          AL        MI        CO
AL  1.000000 -0.285578 -0.101361
MI -0.285578  1.000000 -0.924473
CO -0.101361 -0.924473  1.000000