it-swarm.com.de

Auswählen einer Reihe von pandas Serien / Datenrahmen nach ganzzahligem Index

Ich bin gespannt, warum df[2] nicht unterstützt wird, während df.ix[2] und df[2:3] beide funktionieren.

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

Ich würde erwarten, dass df[2] genauso funktioniert wie df[2:3], um mit der Indizierungskonvention Python übereinzustimmen. Gibt es einen Entwurfsgrund dafür, dass die Indizierung von Zeilen durch einzelne Ganzzahlen nicht unterstützt wird?

345
user1642513

echo @HYRY finden Sie in den neuen Dokumenten in 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Hier haben wir neue Operatoren, .iloc, um nur die Indizierung von Ganzzahlen zu unterstützen, und .loc, um nur die Indizierung von Bezeichnungen zu unterstützen

z.B. Stellen Sie sich dieses Szenario vor

In [1]: df = pd.DataFrame(np.random.Rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] schneidet nur die Zeilen (nach Labelposition)

489
Jeff

Der Hauptzweck des DataFrame-Indizierungsoperators [] ist die Auswahl von Spalten.

Wenn dem Indexierungsoperator eine Zeichenfolge oder eine Ganzzahl übergeben wird, versucht er, eine Spalte mit diesem bestimmten Namen zu finden und als Serie zurückzugeben.

In der obigen Frage: df[2] sucht nach einem Spaltennamen, der dem ganzzahligen Wert 2 entspricht. Diese Spalte existiert nicht und ein KeyError wird ausgelöst.


Der DataFrame-Indizierungsoperator ändert das Verhalten vollständig, um Zeilen auszuwählen, wenn die Slice-Notation verwendet wird

Seltsamerweise wählt der DataFrame-Indizierungsoperator Zeilen aus und kann dies nach ganzzahliger Position oder nach Indexbezeichnung tun.

df[2:3]

Dies schneidet beginnend mit der Zeile mit der Ganzzahlstelle 2 bis 3, ausschließlich des letzten Elements. Also nur eine einzige Reihe. Im Folgenden werden Zeilen ausgewählt, die an der Ganzzahlposition 6 beginnen, bis zu 20, jedoch nicht bei jeder dritten Zeile.

df[6:20:3]

Sie können auch Segmente verwenden, die aus Zeichenfolgenbezeichnungen bestehen, wenn sich in Ihrem DataFrame-Index Zeichenfolgen befinden. Weitere Informationen finden Sie unter diese Lösung in .iloc vs .loc .

Ich verwende diese Slice-Notation fast nie zusammen mit dem Indexierungsoperator, da sie nicht explizit und selten verwendet wird. Wenn Sie nach Reihen schneiden, bleiben Sie bei .loc/.iloc.

47
Ted Petrou

Sie können sich DataFrame als ein Diktat der Serie vorstellen. df[key] Versuchen Sie, den Spaltenindex mit key auszuwählen, und geben Sie ein Series-Objekt zurück.

Das Schneiden innerhalb von [] schneidet jedoch die Zeilen, da dies eine sehr häufige Operation ist.

Sie können das Dokument für Details lesen:

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics

22
HYRY

Für den indexbasierten Zugriff auf die Tabelle pandas kann auch die Option numpy.as_array in Betracht gezogen werden, um die Tabelle in das Array Numpy as zu konvertieren

np_df = df.as_matrix()

und dann

np_df[i] 

würde funktionieren.

13
Pavel Prochazka

Sie können sich den Quellcode ansehen.

DataFrame hat eine private Funktion _slice(), mit der DataFrame geschnitten werden kann, und mit dem Parameter axis kann bestimmt werden, welche Achse geschnitten werden soll. Die __getitem__() für DataFrame setzt die Achse nicht, während _slice() aufgerufen wird. Das _slice() schneidet es also standardmäßig auf Achse 0.

Sie können ein einfaches Experiment machen, das Ihnen helfen könnte:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)
7
waitingkuo

sie können den Datenrahmen wie folgt durchlaufen.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
6
user1401491