wake-up-neo.net

Den Index in einem Pandas DataFrame-Objekt neu definieren

Ich versuche, ein Pandas DataFrame-Objekt neu zu indexieren,

From:
            a   b   c
        0   1   2   3
        1  10  11  12
        2  20  21  22

To :
           b   c
       1   2   3
      10  11  12
      20  21  22

Ich gehe hier vor, wie unten gezeigt, und bekomme die falsche Antwort. Irgendwelche Hinweise, wie das geht?

>>> col = ['a','b','c']
>>> data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)
>>> data
    a   b   c
0   1   2   3
1  10  11  12
2  20  21  22
>>> idx2 = data.a.values
>>> idx2
array([ 1, 10, 20], dtype=int64)
>>> data2 = DataFrame(data,index=idx2,columns=col[1:])
>>> data2
     b   c
1   11  12
10 NaN NaN
20 NaN NaN

Irgendeine Idee, warum das passiert?

79
nitin

Warum verwenden Sie nicht einfach die set_index - Methode?

In : col = ['a','b','c']

In : data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)

In : data
Out:
    a   b   c
0   1   2   3
1  10  11  12
2  20  21  22

In : data2 = data.set_index('a')

In : data2
Out:
     b   c
a
1    2   3
10  11  12
20  21  22
184
Avaris

Wenn Sie kein "a" im Index haben möchten

Im : 

col = ['a','b','c']

data = DataFrame([[1,2,3],[10,11,12],[20,21,22]],columns=col)

data

Aus:

    a   b   c
0   1   2   3
1  10  11  12
2  20  21  22

Im : 

data2 = data.set_index('a')

Aus:

     b   c
a
1    2   3
10  11  12
20  21  22

Im : 

data2.index.name = None

Aus:

     b   c
 1   2   3
10  11  12
20  21  22
5
Aakash Saxena

Wenn Sie den Index festlegen möchten, ohne die Spalte zu verlieren, verwenden Sie set_index mit drop=False:

data.set_index('a', drop=False)

     a   b   c
a             
1    1   2   3
10  10  11  12
20  20  21  22

Eine weitere Option ist, das index-Attribut direkt festzulegen. Dies ist nützlich für leistungskritische Anwendungen:

data.index = data['a']
data
     a   b   c
a             
1    1   2   3
10  10  11  12
20  20  21  22

Wenn "a" herausspringen soll, verwenden Sie 

data.index = data.pop('a')
data
     b   c
a         
1    2   3
10  11  12
20  21  22

Sowohl pop als auch die Zuweisung zu index sind Direktoperationen, im Gegensatz zu set_index, das eine Kopie der Daten zurückgibt. Hier sind einige Timings:

df_ = data.copy()
df = pd.concat([df_] * 10000, ignore_index=True)

%timeit df.set_index('a', drop=False)
%timeit df.index = df['a']

784 µs ± 68 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
132 µs ± 2.12 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Hinweis
Lassen Sie sich nicht von dem inplace=True-Parameter täuschen. Dies erstellt nur eine Kopie der Daten und weist sie dem Original zurück Variable. Sowohl inplace=True als auch inplace=Falseimmer erzeugen eine Kopieren.


Um den Index auf monoton steigende Ganzzahlen einzustellen, können Sie den Index effizient auf ein beliebiges Bereichsobjekt setzen.

df.index = pd.RangeIndex(len(df))
df.index = range(len(df))
df.index = np.arange(len(df))

df.index kann jeder listenartigen Sequenz zugeordnet werden, solange die Sequenz dieselbe Länge hat wie df.

0
coldspeed