如何在pandas数据帧上交换索引和值

7

我有一些数据,其中索引是阈值,值为两个类别0和1的真反率(trns)。

输入图像描述

我想得到一个数据框(dataframe),以tnr为索引,在每个类别中对应该tnr的阈值。本质上,我想要这样:

输入图像描述

我可以通过使用以下代码来实现这个效果:

pd.concat([pd.Series(data[0].index.values, index=data[0]), 
           pd.Series(data[1].index.values, index=data[1])], 
           axis=1)

或者,推广到任意列数:
def invert_dataframe(df): 
    return pd.concat([pd.Series(df[col].index.values, 
                     index=df[col]) for col in df.columns], 
                     axis=1)

然而,这种方法看起来非常粗糙且容易出错。是否有更好的方法来解决这个问题?也许 Pandas 原生功能可以做到这一点?
1个回答

3
你可以使用 stack 以及 pivot 来处理相关 IT 技术内容。
data = pd.DataFrame({0:[10,20,31],10:[4,22,36],
                     1:[7,5,6]}, index=[2.1,1.07,2.13])

print (data)
      0   1   10
2.10  10   7   4
1.07  20   5  22
2.13  31   6  36

df = data.stack().reset_index()
df.columns = list('abc')
df = df.pivot(index='c', columns='b', values='a')
print (df)
b     0     1     10
c                   
4    NaN   NaN  2.10
5    NaN  1.07   NaN
6    NaN  2.13   NaN
7    NaN  2.10   NaN
10  2.10   NaN   NaN
20  1.07   NaN   NaN
22   NaN   NaN  1.07
31  2.13   NaN   NaN
36   NaN   NaN  2.13

有趣,但是我收到了一个 KeyError: 'level_0' - sapo_cosmico
嗯,我将列值分配给列表,也许现在它可以工作了。 - jezrael
然而,这似乎是有效的:s = data.stack().reset_index(name='a')
df = s.pivot(index='a', columns='level_1')
- sapo_cosmico

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接