J'ai des données dans différentes colonnes mais je ne sais pas comment les extraire pour les enregistrer dans une autre variable.
index a b c
1 2 3 4
2 3 4 5
Comment puis-je sélectionner 'a'
, 'b'
et de l' enregistrer pour DF1?
j'ai essayé
df1 = df['a':'b']
df1 = df.ix[:, 'a':'b']
Aucun ne semble fonctionner.
.ix
car c'est ambigu. Utilisez.iloc
ou.loc
si vous devez.> csvtable_imp_1 <- csvtable_imp[0:6]
et il sélectionne le montant delta des premières colonnes entre 0 et 6. Tout ce que j'avais à faire est de lire la table csv comme délimitée avec la bibliothèque readr.infile_1 = largefile_stay.ix[:,0:6]
ix
est désormais obsolète. Pandas recommande d'utiliser:loc
(indexation basée sur les étiquettes) ouiloc
(indexation basée sur la position).Réponses:
Les noms de colonne (qui sont des chaînes) ne peuvent pas être tranchés de la manière que vous avez essayée.
Ici, vous avez quelques options. Si vous savez à partir du contexte quelles variables vous souhaitez découper, vous pouvez simplement renvoyer une vue de ces colonnes uniquement en passant une liste dans la
__getitem__
syntaxe (les []).Alternativement, s'il est important de les indexer numériquement et non par leur nom (par exemple, votre code devrait le faire automatiquement sans connaître les noms des deux premières colonnes), vous pouvez le faire à la place:
De plus, vous devez vous familiariser avec l'idée d'une vue dans un objet Pandas par rapport à une copie de cet objet. La première des méthodes ci-dessus renverra une nouvelle copie en mémoire du sous-objet souhaité (les tranches souhaitées).
Parfois, cependant, il existe des conventions d'indexation dans Pandas qui ne le font pas et vous donnent à la place une nouvelle variable qui fait simplement référence au même bloc de mémoire que le sous-objet ou la tranche dans l'objet d'origine. Cela se produira avec la deuxième façon d'indexer, vous pouvez donc le modifier avec la
copy()
fonction pour obtenir une copie régulière. Lorsque cela se produit, changer ce que vous pensez être l'objet découpé en tranches peut parfois altérer l'objet d'origine. Toujours bon d'être à l'affût de cela.Pour l'utiliser
iloc
, vous devez connaître les positions des colonnes (ou indices). Comme les positions des colonnes peuvent changer, au lieu des indices de codage en dur, vous pouvez utiliseriloc
avec laget_loc
fonction de lacolumns
méthode de l'objet de trame de données pour obtenir les indices des colonnes.Maintenant, vous pouvez utiliser ce dictionnaire pour accéder aux colonnes par des noms et en utilisant
iloc
.la source
df[['a','b']]
produit une copieix[]
si vous préférez l' utiliserix[]
pour une raison quelconque.ix
indexe les lignes, pas les colonnes. Je pensais que l'OP voulait des colonnes.ix
accepte les arguments de tranche, vous pouvez donc également obtenir des colonnes. Par exemple,df.ix[0:2, 0:2]
obtient le sous-tableau 2x2 supérieur gauche comme il le fait pour une matrice NumPy (en fonction des noms de vos colonnes bien sûr). Vous pouvez même utiliser la syntaxe de tranche sur les noms de chaîne des colonnes, commedf.ix[0, 'Col1':'Col5']
. Cela obtient toutes les colonnes qui se trouvent être ordonnées entreCol1
etCol5
dans ledf.columns
tableau. Il est incorrect de dire queix
indexe les lignes. C'est juste son utilisation la plus élémentaire. Il prend également en charge beaucoup plus d'indexation que cela. Donc,ix
est parfaitement général pour cette question..iloc
ce qui exclut la dernière position, tout comme les listes Python.Depuis la version 0.11.0, les colonnes peuvent être découpées de la manière que vous avez essayé d'utiliser l'
.loc
indexeur:est équivalent à
et les colonnes de retours
C
parE
.Une démo sur un DataFrame généré aléatoirement:
Pour obtenir les colonnes de C à E (notez que contrairement au découpage d'entiers, 'E' est inclus dans les colonnes):
Il en va de même pour la sélection de lignes en fonction des étiquettes. Obtenez les lignes «R6» à «R10» à partir de ces colonnes:
.loc
accepte également un tableau booléen afin que vous puissiez sélectionner les colonnes dont l'entrée correspondante dans le tableau estTrue
. Par exemple,df.columns.isin(list('BCD'))
renvoiearray([False, True, True, True, False, False], dtype=bool)
- True si le nom de la colonne est dans la liste['B', 'C', 'D']
; Faux, sinon.la source
En supposant que les noms de vos colonnes (
df.columns
) le sont['index','a','b','c']
, les données que vous souhaitez se trouvent dans les 3e et 4e colonnes. Si vous ne connaissez pas leurs noms lors de l'exécution de votre script, vous pouvez le faireComme le souligne EMS dans sa réponse , les
df.ix
colonnes de tranches sont un peu plus concises, mais l'.columns
interface de découpage pourrait être plus naturelle car elle utilise la syntaxe d'indexation / découpage de liste python 1-D vanilla.WARN:
'index'
est un mauvais nom pour uneDataFrame
colonne. Cette même étiquette est également utilisée pour l'df.index
attribut réel , unIndex
tableau. Votre colonne est donc renvoyée pardf['index']
et le véritable index DataFrame est renvoyé pardf.index
. AnIndex
est un type spécial d'Series
optimisation pour la recherche des valeurs de ses éléments. Pour df.index, il s'agit de rechercher des lignes par leur étiquette. Cetdf.columns
attribut est également unpd.Index
tableau, pour rechercher des colonnes par leurs étiquettes.la source
.ix
n'est pas seulement pour les lignes. Il est destiné à un découpage à usage général et peut être utilisé pour un découpage multidimensionnel. Il s'agit essentiellement d'une interface avec la__getitem__
syntaxe habituelle de NumPy . Cela dit, vous pouvez facilement convertir un problème de colonne trancher un problème rangée découpage en tranches par la simple application d' une opération de transposition,df.T
. Votre exemple utilisecolumns[1:3]
, ce qui est un peu trompeur. Le résultat decolumns
est unSeries
; veillez à ne pas le traiter comme un tableau. En outre, vous devriez probablement le modifiercolumns[2:3]
pour correspondre à votre commentaire "3e et 4e".[2:4]
est correct. Tu[2:3]
as tort. Et l'utilisation de la notation de découpage python standard pour générer une séquence / série n'est pas trompeuse IMO. Mais j'aime votre contournement de l'interface DataFrame pour accéder au tableau numpy sous-jacent avecix
.df.columns
et souhaitez le découper par étiquette , vous aurez alors une sémantique de découpage différente que si vous le découpiez par position d'index entier . Mais je ne l'ai certainement pas bien expliqué dans mon commentaire précédent.columns
s'agit d'une série immuable et le getter a été remplacé pour utiliser des étiquettes comme indices. Merci d'avoir pris le temps de clarifier.la source
df[['b as foo', 'c as bar']
telle que la sortie renomme la colonne enb
tant quefoo
et la colonne enc
tant quebar
?df[['b', 'c']].rename(columns = {'b' : 'foo', 'c' : 'bar'})
Je me rends compte que cette question est assez ancienne, mais dans la dernière version de pandas, il existe un moyen facile de faire exactement cela. Les noms de colonnes (qui sont des chaînes) peuvent être tranchés comme vous le souhaitez.
la source
Vous pouvez fournir une liste de colonnes à supprimer et renvoyer le DataFrame avec uniquement les colonnes nécessaires à l'aide de la
drop()
fonction sur un Pandas DataFrame.Je dis juste
retournerait un DataFrame avec juste les colonnes
b
etc
.La
drop
méthode est documentée ici .la source
Avec les pandas,
avec des noms de colonne
pour sélectionner par iloc et colonnes spécifiques avec numéro d'index:
avec les noms des colonnes loc peuvent être utilisés comme
la source
J'ai trouvé cette méthode très utile:
Plus de détails peuvent être trouvés ici
la source
surveys_df.iloc [:, [2,5]]
alors.À partir de la version 0.21.0, l'utilisation
.loc
ou[]
une liste avec une ou plusieurs étiquettes manquantes est déconseillée.reindex
. Donc, la réponse à votre question est:df1 = df.reindex(columns=['b','c'])
Dans les versions précédentes, l'utilisation
.loc[list-of-labels]
fonctionnait aussi longtemps qu'au moins une des clés était trouvée (sinon elle soulèverait aKeyError
). Ce comportement est obsolète et affiche désormais un message d'avertissement. L'alternative recommandée est d'utiliser.reindex()
.En savoir plus sur Indexation et sélection de données
la source
Vous pouvez utiliser des pandas. Je crée le DataFrame:
Le DataFrame:
Pour sélectionner une ou plusieurs colonnes par nom:
Vous pouvez aussi utiliser:
Et vous obtenez la colonne
Test_2
Vous pouvez également sélectionner des colonnes et des lignes à partir de ces lignes à l'aide de
.loc()
. C'est ce qu'on appelle le "tranchage" . Notez que je prends de la colonneTest_1
àTest_3
La "tranche" est:
Et si vous voulez juste
Peter
etAnn
des colonnesTest_1
etTest_3
:Vous obtenez:
la source
Si vous voulez obtenir un élément par index de ligne et nom de colonne, vous pouvez le faire comme
df['b'][0]
. C'est aussi simple que vous pouvez imaginer.Ou vous pouvez utiliser
df.ix[0,'b']
une utilisation mixte d'index et d'étiquette.Remarque: Depuis v0.20
ix
a été déconseillé en faveur deloc
/iloc
.la source
Une approche différente et facile: itérer les lignes
en utilisant des iterows
la source
Les différentes approches discutées dans les réponses ci-dessus sont basées sur l'hypothèse que l'utilisateur sait que les indices de colonne doivent être supprimés ou sous-définis, ou que l'utilisateur souhaite sous-définir une trame de données en utilisant une plage de colonnes (par exemple entre «C»: «E») . pandas.DataFrame.drop () est certainement une option pour sous-définir les données sur la base d'une liste de colonnes définies par l'utilisateur (bien que vous deviez être prudent de toujours utiliser une copie de la trame de données et les paramètres inplace ne devraient pas être définis sur True !!)
Une autre option consiste à utiliser pandas.columns.difference () , qui fait une différence définie sur les noms de colonnes et renvoie un type d'index de tableau contenant les colonnes souhaitées. Voici la solution:
La sortie serait:
b c 1 3 4 2 4 5
la source
df1 = df[df.columns.difference(columns_for_differencing)]
renverra une nouvelle trame de données / copiée. Vous pourrez modifierdf1
sans altérerdf
. Merci btw. C'était exactement ce dont j'avais besoin.vous pouvez également utiliser df.pop ()
faites-moi savoir si cela vous est utile, veuillez utiliser df.pop (c)
la source
J'ai vu plusieurs réponses à ce sujet, mais je suis resté peu clair. Comment choisiriez-vous ces colonnes d'intérêt? La réponse à cela est que si vous les avez réunis dans une liste, vous pouvez simplement référencer les colonnes à l'aide de la liste.
Exemple
J'ai la liste suivante / tableau numpy
extracted_features
, spécifiant 63 colonnes. L'ensemble de données d'origine comporte 103 colonnes, et j'aimerais extraire exactement celles-ci, puis j'utiliseraisEt vous vous retrouverez avec cela
C'est quelque chose que vous utiliseriez assez souvent dans Machine Learning (plus précisément, dans la sélection des fonctionnalités). Je voudrais également discuter d'autres façons, mais je pense que cela a déjà été couvert par d'autres stackoverflowers. J'espère que cela vous a été utile!
la source
Vous pouvez utiliser une
pandas.DataFrame.filter
méthode pour filtrer ou réorganiser les colonnes comme ceci:la source
la source