2017-05-04 84 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')' –