2017-05-04 73 views
5

mam pewne dane, w których indeks jest próg, a wartości są trns (prawdziwe ujemne stopy) dla dwóch klas 0 i 1.Jak zamienić na wartości indeksu i pandy dataframe

enter image description here

Chcę uzyskać ramkę danych, indeksowaną przez tnr, progu, który odpowiada temu tnr, dla każdej klasy. Zasadniczo, chcę to:

enter image description here

jestem w stanie osiągnąć ten efekt za pomocą następujących czynności:

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

Albo, uogólniając do dowolnej liczby kolumn:

def invert_dataframe(df): 
    return pd.concat([pd.Series(df[col].index.values, 
        index=df[col]) for col in df.columns], 
        axis=1) 

Wydaje się to jednak wyjątkowo hackowskie i podatne na błędy. Czy istnieje lepszy sposób na zrobienie tego, i czy może to natywna funkcjonalność Pandy, która by to zrobiła?

Odpowiedz

1

Można użyć stack z pivot:

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

Ciekawe, ja jednak dostać 'KeyError:„level_0'' –

+0

Hmm, przypisanie wartości kolumny do listy, może teraz to działa. – jezrael

+0

Jednak wydaje się, że działa: 's = data.stack(). Reset_index (name = 'a')' 'df = s.pivot (index = 'a', columns = 'level_1')' –