it-swarm.com.de

Auswählen der letzten n Spalten und Ausschließen der letzten n Spalten in einem Datenrahmen

Wie mache ich:

  1. Letzte 3 Spalten in einem Datenrahmen auswählen und neuen Datenrahmen erstellen?

Ich habe es versucht:

y = dataframe.iloc[:,-3:]
  1. Letzte 3 Spalten ausschließen und einen neuen Datenrahmen erstellen?

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

9
Toly

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.

8
EdChum

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.

0
ananta pant