如何修改代码在含列表的Pandas DataFrame中实现两两Pearson相关分析?
解决Pandas时间序列受试者间两两相关分析的问题
问题原因
你的df2结构不符合corr()的计算要求:Pandas的corr()是计算列与列之间的数值相关性,但你的df2只有一列(728),且每个单元格存储的是列表类型数据,Pandas无法直接对列表进行相关性计算,因此返回空DataFrame。
解决方案:转换DataFrame结构
需要把数据转换成行对应采样点、列对应受试者ID的格式,具体步骤如下:
提取时间序列并重构DataFrame
从df2的728列中提取所有受试者的时间序列列表,用pd.DataFrame重新构造后转置,就能得到符合要求的结构:# 提取728列的时间序列列表,构造新DataFrame并转置 new_df = pd.DataFrame(df2['728'].tolist(), index=df2.index).T- 说明:
df2['728'].tolist()会生成一个包含4个列表的列表(每个子列表对应一个受试者的150个采样点); - 用
pd.DataFrame构造时,默认以受试者ID为索引、每行存储一个受试者的时间序列; - 转置(
.T)后,行变为150个采样点(索引为0到149),列变为4个受试者ID,此时所有单元格都是数值型数据。
- 说明:
计算受试者间两两相关性
现在直接对转换后的new_df调用corr()方法即可:pairwise_cor = new_df.corr(method="pearson")运行后会得到一个4×4的相关系数矩阵,矩阵中的每个值对应两个受试者时间序列的Pearson相关系数。
模拟验证示例
如果你需要测试,可以用以下模拟数据验证流程:
import pandas as pd import numpy as np # 模拟df2结构:4个受试者,每个的728列是含150个随机采样点的列表 df2 = pd.DataFrame( {'728': [np.random.randn(150) for _ in range(4)]}, index=['100610', '102311', '104512', '106713'] ) # 转换结构 new_df = pd.DataFrame(df2['728'].tolist(), index=df2.index).T # 计算两两相关性 pairwise_cor = new_df.corr(method="pearson") print(pairwise_cor)
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

