web-dev-qa-db-fra.com

Sélection des n dernières colonnes et exclusion des n dernières colonnes dans le cadre de données

Comment puis-je:

  1. Sélectionner les 3 dernières colonnes d'un cadre de données et créer un nouveau cadre de données?

J'ai essayé:

y = dataframe.iloc[:,-3:]
  1. Exclure les 3 dernières colonnes et créer un nouveau dataframe?

J'ai essayé:

X = dataframe.iloc[:,:-3]

Est-ce correct?

J'obtiens des erreurs dimensionnelles de tableau dans mon code et je veux m'assurer que cette étape est correcte.

Je vous remercie

9
Toly

il suffit de faire:

y = dataframe[dataframe.columns[-3:]]

Cela coupe les colonnes afin que vous puissiez sous-sélectionner à partir de la df

Exemple:

In [221]:
df = pd.DataFrame(columns=np.arange(10))
df[df.columns[-3:]]

Out[221]:
Empty DataFrame
Columns: [7, 8, 9]
Index: []

Je pense que le problème ici est que, parce que vous avez pris une partie de la df, elle est retournée à une vue, mais en fonction de ce que fait le reste de votre code, cela déclenche un avertissement. Vous pouvez faire une copie explicite en appelant .copy() pour supprimer les avertissements.

Donc, si nous prenons une copie, l’affectation n’affecte que la copie et non l’original df:

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  

Ici, aucun avertissement n’est émis et le format de fichier original n’a pas été modifié.

8
EdChum

Ceci est dû à l’utilisation d’indices entiers (ix sélectionne ceux-ci par libellé sur -3 plutôt que par position, et c’est par leur conception: reportez-vous à l’indexation des entiers dans les pandas "gotchas" *).

* Dans les nouvelles versions de pandas, préférez loc ou iloc pour supprimer l'ambiguïté d'ix en tant que position ou libellé:

df.iloc [-3:] voir la documentation.

Comme le souligne Wes, dans ce cas précis, vous devriez simplement utiliser la queue!

Il convient également de noter que dans les Pandas antérieurs à la version 0.14, iloc générera une erreur IndexError sur un accès hors limites, tandis que .head () et .tail () ne:

pd. version «0,12,0» df = pd.DataFrame ([{"a": 1}, {"a": 2}]) df.iloc [-5:] ... IndexError: hors limites sur la tranche (fin) df.tail (5) une 0 1 1 2 Ancienne réponse (méthode dépréciée):

Vous pouvez utiliser la méthode irows DataFrame pour surmonter cette ambiguïté:

Dans [11]: df1.irow (tranche (-3, Aucun)) Out [11]: STK_ID RPT_Date TCossez la réduction sur les ventes 8 568 20080331 38,75 12,668 NaN 9 568 20080630 30.09 21.102 NaN 10 568 20080930 26,00 30,769 NaN

0
ananta pant