合并 pandas 个数据帧,交替行而不对行进行排序
Merging pandas dataframes, alternating rows without soritng rows
我正在尝试在我的 Pandas 输出中模仿 spss 样式的相关性 table 以使习惯于以这种方式布置矩阵(并且感到恼火)的主管更容易阅读我不再使用 SPSS,因为它们更难阅读)。
这意味着有一个 table,其中 p 值直接放在 table 中相关系数的上方。我已经轻松地生成了 p 值和系数,并将它们分别保存到单独的数据框中,如下所示。
pvals
T 4 Rw Af
T |0.00|0.05|0.24|0.01
4 |0.05|0.00|0.76|0.03
Rw|0.24|0.76|0.00|0.44
...
rs
T 4 Rw Af
T |1.00|0.65|0.28|0.44
4 |0.65|1.00|0.01|0.03
Rw|-0.03|0.01|1.00|0.32
...
我想做的是创建一个 table 合并两个数据帧而不改变索引顺序。看起来像
T |P |0.00|0.05|0.24|0.01
|r |1.00|0.65|0.28|0.44
Rw|P |0.05|0.00|0.76|0.03
|r |0.65|1.00|0.01|0.03
...
现在,我知道如果我的专栏名称是按字母顺序排列的,我可以使用类似
的名称
pd.concat([pvals, rs]).sort_index(kind='merge')
但是,我的列是用描述性的、无序的名称命名的,因此这不起作用,因为它会将索引重新排序为字母顺序。我也知道
df.corr()
将生成一个类似于我上面给出的 rs 示例的矩阵,但这不是我要找的。
如果有人有任何建议,我将不胜感激。
凯夫
您可以将助手 MultiIndex
与 np.arange
和 DataFrame.set_index
with append=True
, add keys
parameter for P
, r
values, sorting by range
s, remove this level and last change order of levels by DataFrame.swaplevel
一起使用:
s1 = pvals.set_index(np.arange(len(pvals)), append=True)
s2 = rs.set_index(np.arange(len(rs)), append=True)
df = (pd.concat([s1, s2], keys=('P','r'))
.sort_index(kind='merge', level=2)
.reset_index(level=2, drop=True)
.swaplevel(0,1))
print (df)
T 4 Rw Af
T P 0.00 0.05 0.24 0.01
r 1.00 0.65 0.28 0.44
4 P 0.05 0.00 0.76 0.03
r 0.65 1.00 0.01 0.03
Rw P 0.24 0.76 0.00 0.44
r -0.03 0.01 1.00 0.32
提问者编辑
代码更改为
后,此答案有效
s1 = pvals.assign(a = np.arange(len(pvals))).set_index('a', append=True)
s2 = rs.assign(a = np.arange(len(rs))).set_index('a', append=True)
df = (pd.concat([s1, s2], keys=('P','r'))
.sort_index(kind='merge', level=2)
.reset_index(level=2, drop=True)
.swaplevel(0,1))
回答者推荐的
我正在尝试在我的 Pandas 输出中模仿 spss 样式的相关性 table 以使习惯于以这种方式布置矩阵(并且感到恼火)的主管更容易阅读我不再使用 SPSS,因为它们更难阅读)。
这意味着有一个 table,其中 p 值直接放在 table 中相关系数的上方。我已经轻松地生成了 p 值和系数,并将它们分别保存到单独的数据框中,如下所示。
pvals
T 4 Rw Af
T |0.00|0.05|0.24|0.01
4 |0.05|0.00|0.76|0.03
Rw|0.24|0.76|0.00|0.44
...
rs
T 4 Rw Af
T |1.00|0.65|0.28|0.44
4 |0.65|1.00|0.01|0.03
Rw|-0.03|0.01|1.00|0.32
...
我想做的是创建一个 table 合并两个数据帧而不改变索引顺序。看起来像
T |P |0.00|0.05|0.24|0.01
|r |1.00|0.65|0.28|0.44
Rw|P |0.05|0.00|0.76|0.03
|r |0.65|1.00|0.01|0.03
...
现在,我知道如果我的专栏名称是按字母顺序排列的,我可以使用类似
的名称pd.concat([pvals, rs]).sort_index(kind='merge')
但是,我的列是用描述性的、无序的名称命名的,因此这不起作用,因为它会将索引重新排序为字母顺序。我也知道
df.corr()
将生成一个类似于我上面给出的 rs 示例的矩阵,但这不是我要找的。
如果有人有任何建议,我将不胜感激。
凯夫
您可以将助手 MultiIndex
与 np.arange
和 DataFrame.set_index
with append=True
, add keys
parameter for P
, r
values, sorting by range
s, remove this level and last change order of levels by DataFrame.swaplevel
一起使用:
s1 = pvals.set_index(np.arange(len(pvals)), append=True)
s2 = rs.set_index(np.arange(len(rs)), append=True)
df = (pd.concat([s1, s2], keys=('P','r'))
.sort_index(kind='merge', level=2)
.reset_index(level=2, drop=True)
.swaplevel(0,1))
print (df)
T 4 Rw Af
T P 0.00 0.05 0.24 0.01
r 1.00 0.65 0.28 0.44
4 P 0.05 0.00 0.76 0.03
r 0.65 1.00 0.01 0.03
Rw P 0.24 0.76 0.00 0.44
r -0.03 0.01 1.00 0.32
提问者编辑
代码更改为
后,此答案有效s1 = pvals.assign(a = np.arange(len(pvals))).set_index('a', append=True)
s2 = rs.assign(a = np.arange(len(rs))).set_index('a', append=True)
df = (pd.concat([s1, s2], keys=('P','r'))
.sort_index(kind='merge', level=2)
.reset_index(level=2, drop=True)
.swaplevel(0,1))
回答者推荐的