2017-05-04 98 views
5

我有一些数据,其中指数是一个阈值,并且该值是为两个类,0和1如何交换索引和值上大熊猫数据帧

enter image description here

TRNS(真阴性率)

我想为每个类获取一个由tnr索引的与该tnr对应的阈值的数据帧。从本质上讲,我想这一点:

enter image description here

我能够通过使用来实现这种效果如下:

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) 

然而,这看起来非常黑客和容易出错。有没有更好的方式来做到这一点,是否有可能做到这一点的本地熊猫功能?

回答

1

您可以使用stackpivot

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 
+0

有趣,我却得到一个'KeyError异常:“level_0'' –

+0

嗯,我给你列的值列出,也许现在它的工作原理。 – jezrael

+0

但是,这似乎工作: 's = data.stack()。reset_index(name ='a')' 'df = s.pivot(index ='a',columns ='level_1')' –