Quel est le moyen le plus simple de supprimer les colonnes en double d'un dataframe?
Je lis un fichier texte contenant des colonnes en double via:
import pandas as pd
df=pd.read_table(fname)
Les noms des colonnes sont:
Time, Time Relative, N2, Time, Time Relative, H2, etc...
Toutes les colonnes Time et Time Relative contiennent les mêmes données. Je voudrais:
Time, Time Relative, N2, H2
Toutes mes tentatives de suppression, de suppression, etc. telles que:
df=df.T.drop_duplicates().T
Il en résulte des erreurs d'index à valeur unique:
Reindexing only valid with uniquely valued index objects
Désolé d'être un noob Pandas. Toute suggestion serait appréciée.
Détails supplémentaires
Version Pandas: 0.9.0
Version Python: 2.7.3
Windows 7
(installé via Pythonxy 2.7.3.0)
fichier de données (note: dans le fichier réel, les colonnes sont séparées par des tabulations, ici elles sont séparées par 4 espaces):
Time Time Relative [s] N2[%] Time Time Relative [s] H2[ppm]
2/12/2013 9:20:55 AM 6.177 9.99268e+001 2/12/2013 9:20:55 AM 6.177 3.216293e-005
2/12/2013 9:21:06 AM 17.689 9.99296e+001 2/12/2013 9:21:06 AM 17.689 3.841667e-005
2/12/2013 9:21:18 AM 29.186 9.992954e+001 2/12/2013 9:21:18 AM 29.186 3.880365e-005
... etc ...
2/12/2013 2:12:44 PM 17515.269 9.991756+001 2/12/2013 2:12:44 PM 17515.269 2.800279e-005
2/12/2013 2:12:55 PM 17526.769 9.991754e+001 2/12/2013 2:12:55 PM 17526.769 2.880386e-005
2/12/2013 2:13:07 PM 17538.273 9.991797e+001 2/12/2013 2:13:07 PM 17538.273 3.131447e-005
import pandas as pd; pd.__version__
)read_table
l'exemple que j'ai composé.Réponses:
Il existe une solution en une seule ligne au problème. Cela s'applique si certains noms de colonnes sont dupliqués et que vous souhaitez les supprimer:
Comment ça fonctionne:
Supposons que les colonnes du bloc de données soient
['alpha','beta','alpha']
df.columns.duplicated()
renvoie un tableau booléen: aTrue
ouFalse
pour chaque colonne. Si c'est le cas,False
le nom de la colonne est unique jusqu'à ce point, si c'est le cas,True
le nom de la colonne est dupliqué plus tôt. Par exemple, en utilisant l'exemple donné, la valeur renvoyée serait[False,False,True]
.Pandas
permet d'indexer en utilisant des valeurs booléennes, par lesquelles il ne sélectionne que leTrue
valeurs. Puisque nous voulons conserver les colonnes non dupliquées, nous avons besoin du tableau booléen ci-dessus pour être retourné (ie[True, True, False] = ~[False,False,True]
)Finalement,
df.loc[:,[True,True,False]]
sélectionne uniquement les colonnes non dupliquées à l'aide de la capacité d'indexation susmentionnée.Remarque : ce qui précède ne vérifie que les noms de colonnes, pas les valeurs de colonne.
la source
df.T.drop_duplicates().T
.Il semble que vous connaissez déjà les noms de colonnes uniques. Si tel est le cas,
df = df['Time', 'Time Relative', 'N2']
cela fonctionnerait.Sinon, votre solution devrait fonctionner:
Vous avez probablement quelque chose de spécifique à vos données qui gâche tout. Nous pourrions vous aider davantage si vous pouviez nous donner plus de détails sur les données.
Edit: Comme Andy l'a dit, le problème vient probablement des titres de colonne en double.
Pour un exemple de fichier de table 'dummy.csv', j'ai créé:
l'utilisation
read_table
donne des colonnes uniques et fonctionne correctement:Si votre version ne le permet pas, vous pouvez pirater ensemble une solution pour les rendre uniques:
la source
df['Time']
sélectionne toutes les séries temporelles (c'est-à-dire renvoie un DataFrame), etdf['Time', ..]
cela renverra le DataFrame entier.RecursionError: maximum recursion depth exceeded
La transposition est inefficace pour les grands DataFrames. Voici une alternative:
Utilisez-le comme ceci:
Éditer
Une version à mémoire efficace qui traite nans comme toute autre valeur:
la source
my_df.T.drop_duplicates().T
accrocherait des cadres de données volumineux./usr/local/lib/python3.5/dist-packages/ipykernel_launcher.py:17: DeprecationWarning: 'pandas.core.common.array_equivalent' is deprecated and is no longer public API
if array_equivalent(ia, ja):
parif np.array_equal(ia, ja):
semble produire les mêmes résultats mais j'ai lu qu'il ne gère pas bien les NaN.array_equivalent
toujours disponible dans le référentiel public, éventuellement sur une ancienne branche?numpy.array_equiv
; pour les pandas, je ne vois aucune branche de version antérieure sur GitHub,pandas.core.common
mais il y a peut-être d'autres endroits à chercherSi je ne me trompe pas, ce qui suit fait ce qui a été demandé sans les problèmes de mémoire de la solution de transposition et avec moins de lignes que la fonction de @kalu, en conservant la première de toutes les colonnes de nom similaire.
la source
Il semble que vous étiez sur la bonne voie. Voici le one-liner que vous recherchiez:
Mais comme il n'y a pas de trame de données d'exemple qui produit le message d'erreur référencé
Reindexing only valid with uniquely valued index objects
, il est difficile de dire exactement ce qui résoudrait le problème. si la restauration de l'index d'origine est importante pour vous, procédez comme suit:la source
Première étape: - Lire la première ligne, c'est-à-dire toutes les colonnes, supprimer toutes les colonnes en double.
Deuxième étape: - Enfin, ne lisez que les colonnes.
la source
Je suis tombé sur ce problème où la seule doublure fournie par la première réponse fonctionnait bien. Cependant, j'ai eu la complication supplémentaire où la deuxième copie de la colonne avait toutes les données. La première copie ne l'a pas fait.
La solution consistait à créer deux trames de données en divisant la trame de données en basculant l'opérateur de négation. Une fois que j'ai eu les deux trames de données, j'ai exécuté une instruction de jointure en utilisant le
lsuffix
. De cette façon, je pourrais alors référencer et supprimer la colonne sans les données.- E
la source
La méthode ci-dessous identifiera les colonnes de dupe pour examiner ce qui ne va pas lors de la création du dataframe à l'origine.
la source
Un moyen rapide et facile de supprimer les colonnes dupliquées par leurs valeurs:
df = df.T.drop_duplicates (). T
Plus d'informations: Manuel de Pandas DataFrame drop_duplicates .
la source