Comment puis-je charger efficacement des données sur des questions Stack Overflow à l'aide de pandas read_clipboard?

Dec 20 2020

Je remarque que beaucoup de questions de pandas sur Stack Overflow n'incluent que quelques lignes de leurs données sous forme de texte, sans le code d'accompagnement pour le générer / le reproduire. Je suis conscient de l'existence de read_clipboardmais je suis incapable de comprendre comment appeler efficacement cette fonction pour lire des données dans de nombreuses situations, par exemple lorsqu'il y a des espaces blancs dans les noms d'en-tête ou des objets Python tels que des listes dans les colonnes.

Comment puis-je utiliser pd.read_clipboardplus efficacement pour lire des données collées dans des formats non conventionnels qui ne se prêtent pas à une lecture facile en utilisant les arguments par défaut? Y a-t-il des situations où il n'y a rien read_clipboard?

Réponses

4 cs95 Dec 20 2020 at 17:46

read_clipboard: Guide du débutant


read_clipboardest vraiment une grâce salvatrice pour tous ceux qui commencent à répondre aux questions du tag pandas . Malheureusement, les vétérans des pandas savent également que les données fournies dans les questions ne sont pas toujours faciles à intégrer dans un terminal en raison de diverses complications dans le format des données publiées.

Heureusement, il read_clipboarda des arguments qui rendent la gestion de la plupart de ces cas possible (et facile). Voici quelques cas d'utilisation courants et leurs arguments correspondants.


Cas d'utilisation courants

read_clipboardutilise read_csvsous le capot avec un séparateur d'espaces, donc de nombreuses techniques d'analyse des données à partir de CSV s'appliquent ici, telles que

  • analyse des colonnes avec des espaces dans les données

    • utiliser sepavec l'argument regex. Tout d'abord, assurez-vous qu'il y a au moins deux espaces entre les colonnes et au plus un espace blanc consécutif à l'intérieur des données de la colonne elle-même. Ensuite, vous pouvez utiliser sep=r'\s{2,}'ce qui signifie «colonnes séparées en recherchant au moins deux espaces blancs consécutifs pour le séparateur» (note: engine='python'est requis pour les séparateurs multichar ou regex):

       df = pd.read_clipboard(..., sep=r'\s{2,}', engine='python')
      

      Consultez également Comment gérer les noms de colonnes contenant des espaces lorsque vous utilisez pd.read_clipboard? .

  • lire une série au lieu de DataFrame

    • utiliser squeeze=true, vous en auriez probablement également besoin header=Nonesi la première ligne contient également des données.

       s = pd.read_clipboard(..., header=None, squeeze=True)
      

      Voir aussi Pourrait-il y avoir un moyen plus simple d'utiliser pandas read_clipboard pour lire une série? .

  • chargement de données avec des noms d'en-tête personnalisés

    • utiliser names=[...]en conjonction avec header=Noneet skiprows=[0]pour ignorer les en-têtes existants.

       df = pd.read_clipboard(..., header=None, names=['a', 'b', 'c'], skiprows=[0])
      
  • chargement de données sans en-tête

    • utilisation header=None
  • définir une ou plusieurs colonnes comme index

    • utiliser index_col=[...]avec l'étiquette ou l'index approprié
  • analyse des dates

    • utiliser parse_datesavec le format approprié. En cas d'analyse datetimes(c'est-à-dire des colonnes dont la date est séparée par horodatage), vous devrez probablement également l'utiliser sep=r'\s{2,}'tout en vous assurant que vos colonnes sont séparées par au moins deux espaces.

Voir cette réponse de moi pour une liste plus complète des read_csvarguments pour d'autres cas non couverts ici ...


Mises en garde

read_clipboardest un couteau suisse. Cependant, il

  • ne peut pas lire les données dans les formats prettytable / tabulate (IOW, les bordures le rendent plus difficile)

    • Voir Lecture dans une trame de données joliment imprimée / formatée à l'aide de pd.read_clipboard? pour trouver des solutions pour y remédier.
  • ne peut pas analyser correctement les MultIndex à moins que tous les éléments de l'index ne soient spécifiés.

    • Voir Copie de dataframes MultiIndex avec pd.read_clipboard? pour trouver des solutions pour y remédier.
  • ne peut pas ignorer / gérer les ellipses dans les données

    • ma méthode suggérée est de supprimer manuellement les ellipses avant l'impression
  • ne peut pas analyser les colonnes de listes (ou d'autres objets) comme autre chose qu'une chaîne. Les colonnes devront être converties séparément, comme indiqué dans Comment lisez-vous dans un dataframe avec des listes en utilisant pd.read_clipboard? .

  • ne peut pas lire le texte des images (veuillez donc ne pas utiliser d'images comme moyen de partager vos données avec des gens, s'il vous plaît!)

2 etch_45 Dec 20 2020 at 18:23

La seule faiblesse de cette fonction est qu'elle ne capture pas le contenu CTRL + Csi la copie est effectuée à partir d'un PDFfichier. Le tester de cette façon entraîne une lecture vide.

Mais en utilisant un éditeur de texte standard, cela se passe très bien. Voici un exemple utilisant du texte saisi au hasard:

>>> pd.read_clipboard()
Empty DataFrame
Columns: [sfsesfsdsxcvfsdf]
Index: []