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?
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
In
ou Out
ou cela ne fonctionnera pasengine='python'
(voir ce problème sur GitHub). Le moteur "c" est actuellement rompu lorsque l'index est nommé.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!
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:
StringIO
enveloppe la sortie dans un objet de type fichier, qui read_csv
a besoin.sep
sur \s+
fait en sorte que chaque bloc contigu d'espace blanc soit traité comme un seul délimiteur.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.
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.