如何使用Pandas将R的Tukey的HSD表转换为Python中的相关矩阵

问题描述 投票:0回答:2

我最近从 R 的 TukeyHSD 测试中导出了一个表格,以获得各个时间组(0、5、10、20、30、40、50、60)的 p 值。我很好奇是否有一种方法可以将其转换为相关矩阵,其中每个轴代表时间组并对应于各自的 p 值。

该表包含一个索引,指示不同时间组之间的对应关系(例如,5-10 或 10-50)。我已将其作为数据框导入到 Python 中。有没有办法重新排列数据框,如下所示?

        p adj
Groups  
50-0    2.815526e-13
60-0    2.855494e-13
20-0    4.764197e-08
50-5    1.712389e-05
50-10   1.483440e-04
50-40   1.643480e-04
60-5    5.873007e-04
60-10   5.218047e-03
60-40   5.613566e-03
10-0    6.878476e-03
40-0    1.270855e-02
20-5    7.380859e-02
50-20   1.574372e-01
40-20   3.264569e-01
20-10   3.369147e-01
5-0 3.816166e-01
60-50   7.301423e-01
60-20   8.503578e-01
10-5    9.731384e-01
40-5    9.820983e-01
40-10   1.000000e+00

我希望它是这样的:

        0    5    10    20    ...
0       ...  ...  ...  ...
5       ...  ...  ...  ...
10      ...  ...  ...  ...
20      ...  ...  ...  ...
...

我在网上没有找到类似的东西,所以我不知道从哪里开始。

python pandas correlation tukey
2个回答
0
投票

只需使用

创建一个数据框
  • index
    原始数据帧索引第0个分割的唯一值(df)
  • columns
    是原始数据帧(df)第一个分割索引的唯一值
final = pd.DataFrame(
    {},
    index = df.index.map(lambda x: x.split('-')[0]).unique().map(lambda x: int(x)).sort_values(),
    columns = df.index.map(lambda x: x.split('-')[1]).unique().map(lambda x: int(x)).sort_values()
)

for i in final.index:
    for j in final.columns:
        try:
            final.loc[i, j] = df.loc[f'{i}-{j}', 'p adj']
        except:
            final.loc[i, j] = np.nan

输出:

Groups        0         5         10        20        40        50
Groups                                                            
5       0.381617       NaN       NaN       NaN       NaN       NaN
10      0.006878  0.973138       NaN       NaN       NaN       NaN
20           0.0  0.073809  0.336915       NaN       NaN       NaN
40      0.012709  0.982098       1.0  0.326457       NaN       NaN
50      0.281553  0.000017  0.000148  0.157437  0.000164       NaN
60           0.0  0.000587  0.005218  0.850358  0.005614  0.730142

然后迭代最终数据帧的 (ith, jth) 位置并使用动态创建的索引形式原始数据帧填充这些值。

必须有一些最佳解决方案,充分利用 pandas 的矢量化,无需循环中继。


0
投票

尝试:

df[["x", "y"]] = df.index.str.split("-", expand=True).to_frame().astype(int).values
print(pd.crosstab(df["x"], df["y"], df["p adj"], aggfunc="first"))

打印:

y             0         5         10        20        40        50
x                                                                 
5   3.816166e-01       NaN       NaN       NaN       NaN       NaN
10  6.878476e-03  0.973138       NaN       NaN       NaN       NaN
20  4.764197e-08  0.073809  0.336915       NaN       NaN       NaN
40  1.270855e-02  0.982098  1.000000  0.326457       NaN       NaN
50  2.815526e-13  0.000017  0.000148  0.157437  0.000164       NaN
60  2.855494e-13  0.000587  0.005218  0.850358  0.005614  0.730142
© www.soinside.com 2019 - 2024. All rights reserved.