我最近从 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 ... ... ... ...
...
我在网上没有找到类似的东西,所以我不知道从哪里开始。
只需使用
创建一个数据框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 的矢量化,无需循环中继。
尝试:
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