web-dev-qa-db-fra.com

Comment copier / coller DataFrame de Stack Overflow dans Python

Dans questions et réponses , les utilisateurs affichent très souvent un exemple DataFrame avec lequel leur question/réponse fonctionne:

In []: x
Out[]: 
   bar  foo
0    4    1
1    5    2
2    6    3

Il serait vraiment utile de pouvoir obtenir ce DataFrame dans mon Python afin que je puisse commencer à déboguer la question ou à tester la réponse.

Comment puis-je faire ceci?

45
LondonRob

Pandas est écrit par des gens qui savent vraiment ce que les gens veulent faire.

Depuis la version 0.13 il y a une fonction pd.read_clipboard ce qui est absurdement efficace pour que cela "marche juste".

Copiez et collez la partie du code dans la question qui commence bar foo, (c'est-à-dire le DataFrame) et faites-le dans un interpréteur Python:

In [53]: import pandas as pd
In [54]: df = pd.read_clipboard()

In [55]: df
Out[55]: 
   bar  foo
0    4    1
1    5    2
2    6    3

Avertissements

  • N'incluez pas l'iPython In ou Out ou cela ne fonctionnera pas
  • Si vous avez un index nommé, vous devez actuellement ajouter engine='python' (voir ce problème sur GitHub). Le moteur "c" est actuellement rompu lorsque l'index est nommé.
  • Ce n'est pas brillant chez MultiIndexes:

Essaye ça:

                      0         1         2
level1 level2                              
foo    a       0.518444  0.239354  0.364764
       b       0.377863  0.912586  0.760612
bar    a       0.086825  0.118280  0.592211

qui ne fonctionne pas du tout, ou ceci:

              0         1         2
foo a  0.859630  0.399901  0.052504
    b  0.231838  0.863228  0.017451
bar a  0.422231  0.307960  0.801993

Ce qui fonctionne, mais renvoie quelque chose de totalement incorrect!

52
LondonRob

pd.read_clipboard() est astucieux. Cependant, si vous écrivez du code dans un script ou un bloc-notes (et que vous souhaitez que votre code fonctionne à l'avenir), ce n'est pas un bon choix. Voici une autre façon de copier/coller la sortie d'une trame de données dans un nouvel objet de trame de données qui garantit que df survivra au contenu de votre presse-papiers:

# py3 only, see below for py2
import pandas as pd
from io import StringIO

d = '''0   1   2   3   4
A   Y   N   N   Y
B   N   Y   N   N
C   N   N   N   N
D   Y   Y   N   Y
E   N   Y   Y   Y
F   Y   Y   N   Y
G   Y   N   N   Y'''

df = pd.read_csv(StringIO(d), sep='\s+')

Quelques notes:

  • La chaîne entre guillemets triples préserve les sauts de ligne dans la sortie.
  • StringIO enveloppe la sortie dans un objet de type fichier, qui read_csv a besoin.
  • Définition de sep sur \s+ fait en sorte que chaque bloc contigu d'espace blanc soit traité comme un seul délimiteur.

mettre à jour

La réponse ci-dessus est Python 3 uniquement. Si vous êtes coincé dans Python 2, remplacez la ligne d'importation:

from io import StringIO

avec à la place:

from StringIO import StringIO

Si vous avez une ancienne version de pandas (v0.24 ou plus ancien), il existe un moyen simple d'écrire une version compatible Py2/Py3 du code ci-dessus:

import pandas as pd

d = ...
df = pd.read_csv(pd.compat.StringIO(d), sep='\s+')

Les dernières versions de pandas ont supprimé le module compat avec la prise en charge Python 2.

9
tel

Si vous copiez-collez à partir d'un fichier CSV qui a des entrées standard comme celle-ci:

2016,10,M,0600,0610,13,1020,24
2016,3,F,0300,0330,21,6312,1
2015,4,M,0800,0830,8,7112,30
2015,10,M,0800,0810,19,0125,1
2016,8,M,1500,1510,21,0910,2
2015,10,F,0800,0810,3,8413,5

df =pd.read_clipboard(sep=",", header=None)
df.rename(columns={0: "Name0", 1: "Name1",2:"Name2",3:"Name3",4:"Name4",5:"Name5",6:"Name6",7:"Name7",8:"Name8"})

vous donnera correctement défini pandas Dataframe.

enter image description here

0
Harvey