410 Stimmen

Spaltenindex aus Spaltenname in Python Pandas abrufen

Wenn Sie in R einen Spaltenindex basierend auf dem Namen der Spalte abrufen müssen, können Sie Folgendes tun

idx <- which(names(my_data)==my_colum_name)

Gibt es eine Möglichkeit, das gleiche mit Pandas Dataframes zu tun?

652voto

DSM Punkte 317386

Sicher, Sie können die .get_loc() :

In [45]: df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})

In [46]: df.columns
Out[46]: Index([apple, orange, pear], dtype=object)

In [47]: df.columns.get_loc("pear")
Out[47]: 2

obwohl ich das, um ehrlich zu sein, selbst nicht oft brauche. Normalerweise macht der Zugriff über den Namen, was ich will ( df["pear"] , df[["apple", "orange"]] oder vielleicht df.columns.isin(["orange", "pear"]) ), obwohl ich mir durchaus Fälle vorstellen kann, in denen Sie die Indexnummer benötigen.

81voto

snovik Punkte 997

Hier ist eine Lösung durch Listenverständnis. cols ist die Liste der Spalten, für die ein Index erstellt werden soll:

[df.columns.get_loc(c) for c in cols if c in df]

22voto

JE_Muc Punkte 4980

Um mehrere Spaltenindizes zurückzugeben, empfehle ich die Verwendung der pandas.Index Methode get_indexer wenn Sie einzigartige Etiketten :

df = pd.DataFrame({"pear": [1, 2, 3], "apple": [2, 3, 4], "orange": [3, 4, 5]})
df.columns.get_indexer(['pear', 'apple'])
# Out: array([0, 1], dtype=int64)

Si tiene nicht eindeutige Etiketten im Index (Spalten unterstützen nur eindeutige Bezeichnungen) get_indexer_for . Er nimmt die gleichen Argumente wie get_indexer :

df = pd.DataFrame(
    {"pear": [1, 2, 3], "apple": [2, 3, 4], "orange": [3, 4, 5]}, 
    index=[0, 1, 1])
df.index.get_indexer_for([0, 1])
# Out: array([0, 1, 2], dtype=int64)

Beide Methoden unterstützen auch ungenaue Indizierung mit, z.B. für Float-Werte, wobei der nächstliegende Wert mit einer Toleranz genommen wird. Wenn zwei Indizes den gleichen Abstand zum angegebenen Label haben oder Duplikate sind, wird der Index mit dem größeren Indexwert ausgewählt:

df = pd.DataFrame(
    {"pear": [1, 2, 3], "apple": [2, 3, 4], "orange": [3, 4, 5]},
    index=[0, .9, 1.1])
df.index.get_indexer([0, 1])
# array([ 0, -1], dtype=int64)

18voto

Wes McKinney Punkte 94041

Die Lösung von DSM funktioniert, aber wenn man eine direkte Entsprechung zu which könnten Sie tun (df.columns == name).nonzero()

13voto

Divakar Punkte 211985

Wenn Sie nach Übereinstimmungen in mehreren Spalten suchen, ist eine vektorisierte Lösung mit searchsorted método verwendet werden könnte. Somit ist mit df als den Datenrahmen und query_cols als die zu suchenden Spaltennamen, wäre eine Implementierung -

def column_index(df, query_cols):
    cols = df.columns.values
    sidx = np.argsort(cols)
    return sidx[np.searchsorted(cols,query_cols,sorter=sidx)]

Probelauf -

In [162]: df
Out[162]: 
   apple  banana  pear  orange  peach
0      8       3     4       4      2
1      4       4     3       0      1
2      1       2     6       8      1

In [163]: column_index(df, ['peach', 'banana', 'apple'])
Out[163]: array([4, 1, 0])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X