Wie mache ich:
Ich habe es versucht:
y = dataframe.iloc[:,-3:]
Ich habe es versucht:
X = dataframe.iloc[:,:-3]
Ist das richtig?
Ich bekomme weiterhin Array-Dimensionsfehler in meinem Code und möchte sicherstellen, dass dieser Schritt korrekt ist.
Vielen Dank
mach einfach:
y = dataframe[dataframe.columns[-3:]]
Dadurch werden die Spalten aufgeteilt, sodass Sie aus der Datenbank eine Auswahl treffen können
Beispiel:
In [221]:
df = pd.DataFrame(columns=np.arange(10))
df[df.columns[-3:]]
Out[221]:
Empty DataFrame
Columns: [7, 8, 9]
Index: []
Ich denke, das Problem hier ist, dass Sie eine Ansicht zurückgegeben haben, weil Sie ein Stück des Df genommen haben. Je nachdem, was der Rest Ihres Codes tut, wird jedoch eine Warnung ausgegeben. Sie können eine explizite Kopie erstellen, indem Sie .copy()
aufrufen, um die Warnungen zu entfernen.
Wenn wir also eine Kopie erstellen, wirkt sich die Zuordnung nur auf die Kopie und nicht auf das Original df aus:
In [15]:
df = pd.DataFrame(np.random.randn(5,10), columns= np.arange(10))
df
Out[15]:
0 1 2 3 4 5 6 \
0 0.568284 -1.488447 0.970365 -1.406463 -0.413750 -0.934892 -1.421308
1 1.186414 -0.417366 -1.007509 -1.620530 -1.322004 0.294540 1.205115
2 -1.073894 -0.214972 1.516563 -0.705571 0.068666 1.690654 -0.252485
3 0.923524 -0.856752 0.226294 -0.660085 1.259145 0.400596 0.559028
4 0.259807 0.135300 1.130347 -0.317305 -1.031875 0.232262 0.709244
7 8 9
0 1.741925 -0.475619 -0.525770
1 2.137546 0.215665 1.908362
2 1.180281 -0.144652 0.870887
3 -0.609804 -0.833186 -1.033656
4 0.480943 1.971933 1.928037
In [16]:
y = df[df.columns[-3:]].copy()
y
Out[16]:
7 8 9
0 1.741925 -0.475619 -0.525770
1 2.137546 0.215665 1.908362
2 1.180281 -0.144652 0.870887
3 -0.609804 -0.833186 -1.033656
4 0.480943 1.971933 1.928037
In [17]:
y[y>0] = 0
print(y)
df
7 8 9
0 0.000000 -0.475619 -0.525770
1 0.000000 0.000000 0.000000
2 0.000000 -0.144652 0.000000
3 -0.609804 -0.833186 -1.033656
4 0.000000 0.000000 0.000000
Out[17]:
0 1 2 3 4 5 6 \
0 0.568284 -1.488447 0.970365 -1.406463 -0.413750 -0.934892 -1.421308
1 1.186414 -0.417366 -1.007509 -1.620530 -1.322004 0.294540 1.205115
2 -1.073894 -0.214972 1.516563 -0.705571 0.068666 1.690654 -0.252485
3 0.923524 -0.856752 0.226294 -0.660085 1.259145 0.400596 0.559028
4 0.259807 0.135300 1.130347 -0.317305 -1.031875 0.232262 0.709244
7 8 9
0 1.741925 -0.475619 -0.525770
1 2.137546 0.215665 1.908362
2 1.180281 -0.144652 0.870887
3 -0.609804 -0.833186 -1.033656
4 0.480943 1.971933 1.928037
Hier wird keine Warnung ausgegeben und die ursprüngliche Version bleibt unberührt.
Dies ist auf die Verwendung von Ganzzahlindizes zurückzuführen (ix wählt diese über die Beschriftung über -3 anstelle der Position aus, und dies ist beabsichtigt: Siehe Ganzzahlindizierung in Pandas "Gotchas" *).
* In neueren Versionen von Pandas bevorzugen loc oder iloc, um die Mehrdeutigkeit von ix als Position oder Bezeichnung zu entfernen:
df.iloc [-3:] siehe die Dokumente.
Wie Wes darauf hinweist, sollten Sie in diesem speziellen Fall nur Schwanz verwenden!
Es sollte auch beachtet werden, dass in Pandas vor 0,14 iloc einen IndexError für einen Zugriff außerhalb des zulässigen Bereichs auslöst, während .head () und .tail () nicht:
pd. version '0.12.0' df = pd.DataFrame ([{"a": 1}, {"a": 2}])). df.iloc [-5:] ... IndexError: Out-of-Bounds auf Scheibe (Ende) df.tail (5) a 0 1 1 2 Alte Antwort (abgeschriebene Methode):
Sie können die DataFrame-Methode irows verwenden, um diese Mehrdeutigkeit zu überwinden:
In [11]: df1.irow (Slice (-3, None)) Out [11]: STK_ID RPT_Date TClose Verkaufsrabatt 8 568 20080331 38,75 12,668 NaN 9 568 20080630 30.09 21.102 NaN 10 568 20080930 26.00 30.769 NaN Anmerkung: Serien haben ein ähnliches iget-Verfahren.