Je charge des données d'apprentissage automatique à partir d'un fichier CSV. Les 2 premières colonnes sont des observations et les colonnes restantes sont des caractéristiques.
Actuellement, je fais ce qui suit:
data = pandas.read_csv('mydata.csv')
ce qui donne quelque chose comme:
data = pandas.DataFrame(np.random.rand(10,5), columns = list('abcde'))
Je voudrais découper cette trame de données en deux trames de données: une contenant les colonnes a
et b
et l'autre contenant les colonnes c
, d
et e
.
Il n'est pas possible d'écrire quelque chose comme
observations = data[:'c']
features = data['c':]
Je ne sais pas quelle est la meilleure méthode. Ai-je besoin d'un pd.Panel
?
Soit dit en passant, je trouve que l'indexation des trames de données est assez incohérente: data['a']
est autorisée, mais data[0]
ne l'est pas. De l'autre côté, data['a':]
n'est pas autorisé mais l' data[0:]
est. Y a-t-il une raison pratique à cela? C'est vraiment déroutant si les colonnes sont indexées par Int, étant donné quedata[0] != data[0:1]
df[5:10]
ont été ajoutées pour sélectionner des lignes ( pandas.pydata.org/pandas-docs/stable/… )Réponses:
Réponse 2017 - pandas 0.20: .ix est déconseillé. Utilisez .loc
Voir la dépréciation dans la documentation
.loc
utilise l'indexation basée sur les étiquettes pour sélectionner à la fois les lignes et les colonnes. Les étiquettes étant les valeurs de l'index ou des colonnes. Le découpage avec.loc
inclut le dernier élément..loc
accepte la même notation de tranche que les listes Python pour les lignes et les colonnes. Notation de tranche étantstart:stop:step
Vous pouvez découper par lignes et colonnes. Par exemple, si vous avez 5 lignes avec des étiquettes
v
,w
,x
,y
,z
la source
df['newcol'] = df.apply(lambda row: myfunc(row), axis=1)
alors vous pouvez enmyfunc(row){
... utiliserrow['foo':'ant']
. par exemple (selon cette réponse StackOverflow ), à l'intérieur dumyfunc
vous pouvez évaluer si l'un d'eux n'est pas numérique:row['foo':'ant'].apply(lambda x: isinstance(x, str)).any()
.iloc
devrait être utilisé maintenant, au lieu de.loc
. Réparez cela, et je vais le voter.Remarque:
.ix
est obsolète depuis Pandas v0.20. Vous devez plutôt utiliser.loc
ou.iloc
, selon le cas.L'index DataFrame.ix est ce à quoi vous souhaitez accéder. C'est un peu déroutant (je suis d'accord que l'indexation Pandas est parfois déroutante!), Mais ce qui suit semble faire ce que vous voulez:
où .ix [tranche de ligne, tranche de colonne] est ce qui est interprété. Plus d'informations sur l'indexation des pandas ici: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-advanced
la source
>>>data.ix[:, 'a':'c'] a b c 0 0.859192 0.881433 0.843624 1 0.744979 0.427986 0.177159
df.ix[:,[0,3,4]]
df.ix[:,'b':'e']
?loc
place deix
: stackoverflow.com/a/31593712/4323Permet d'utiliser le jeu de données titanesque du package seaborn comme exemple
ou
la source
.ix
est obsolète.Passing list-likes to .loc or [] with any missing label will raise KeyError in the future, you can use .reindex() as an alternative.
lorsque vous utilisezdf.loc[:, some_list_of_columns]
En outre, étant donné un DataFrame
comme dans votre exemple, si vous souhaitez extraire uniquement les colonnes a et d (ei la 1ère et la 4ème colonne), iloc mothod de la base de données pandas est ce dont vous avez besoin et pourrait être utilisé très efficacement. Tout ce que vous devez savoir, c'est l'index des colonnes que vous souhaitez extraire. Par exemple:
te donnera
la source
Vous pouvez découper les colonnes d'un
DataFrame
en vous référant aux noms de chaque colonne d'une liste, comme ceci:la source
get_loc
fonction ondata.columns
pour déterminer l'indice de la colonne «b» ou autre chose.Et si vous êtes venu ici à la recherche de deux tranches de colonnes et de les combiner (comme moi), vous pouvez faire quelque chose comme
Cela créera une nouvelle trame de données avec 900 premières colonnes et (toutes) colonnes> 3593 (en supposant que vous avez environ 4000 colonnes dans votre ensemble de données).
la source
Voici comment vous pouvez utiliser différentes méthodes pour effectuer un découpage de colonne sélectif, notamment un découpage de colonne basé sur une étiquette sélective, un index et une plage sélective.
la source
Son équivalent
la source
si la trame de données ressemble à ça:
et OUTPUT pourrait être comme
si vous utilisez l'opérateur logique np.logical_not
plus à propos
https://docs.scipy.org/doc/numpy-1.13.0/reference/routines.logic.html
autres opérateurs logiques
logic_and (x1, x2, / [, out, where, ...]) Calculez la valeur de vérité de x1 ET x2 élément par élément.
logic_or (x1, x2, / [, out, where, casting, ...]) Calculez la valeur de vérité de x1 OU x2 élément par élément.
la source
Une autre façon d'obtenir un sous-ensemble de colonnes à partir de votre DataFrame, en supposant que vous voulez toutes les lignes, serait de faire:
data[['a','b']]
etdata[['c','d','e']]
si vous souhaitez utiliser des index de colonnes numériques, vous pouvez le faire:
data[data.columns[:2]]
etdata[data.columns[2:]]
la source