如何将StackOverflow中的DataFrame复制/粘贴到Python中

Lon*_*Rob 39 python clipboard pandas

问题答案中,用户经常发布DataFrame他们的问题/答案适用的示例:

In []: x
Out[]: 
   bar  foo
0    4    1
1    5    2
2    6    3
Run Code Online (Sandbox Code Playgroud)

能够将它DataFrame放入我的Python解释器中是非常有用的,这样我就可以开始调试问题,或者测试答案.

我怎样才能做到这一点?

Lon*_*Rob 47

熊猫是由真正了解人们想做什么的人写的.

从版本开始0.13,这个功能pd.read_clipboard在使这个"正常工作"方面非常有效.

将部分代码复制并粘贴到开始的问题中bar foo(即DataFrame)并在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
Run Code Online (Sandbox Code Playgroud)

注意事项

  • 不要包含iPython In或其他Out东西,否则它将无效
  • 如果您有一个命名索引,则当前需要添加engine='python'(请参阅GitHub上的此问题).当命名索引时,'c'引擎当前被破坏.
  • MultiIndexes并不出色:

试试这个:

                      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
Run Code Online (Sandbox Code Playgroud)

这根本不起作用,或者说:

              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
Run Code Online (Sandbox Code Playgroud)

哪个有效,但返回的内容完全错误!


tel*_*tel 17

pd.read_clipboard()很漂亮。但是,如果您在脚本或笔记本中编写代码(并且您希望您的代码在未来工作),则它不太适合。这是将数据帧的输出复制/粘贴到新的数据帧对象中的另一种方法,以确保它df比剪贴板的内容更持久:

# 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+')
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  • 三引号字符串保留输出中的换行符。
  • StringIO将输出包装在一个类似文件的对象中,这read_csv需要。
  • 设置sep\s+使每个连续的空白块都被视为单个分隔符。

更新

上面的答案仅适用于 Python 3。如果您被困在 Python 2 中,请替换导入行:

from io import StringIO
Run Code Online (Sandbox Code Playgroud)

相反:

from StringIO import StringIO
Run Code Online (Sandbox Code Playgroud)

如果您有pandasv0.24或更旧)的旧版本,则有一种简单的方法可以编写上述代码的 Py2/Py3 兼容版本:

import pandas as pd

d = ...
df = pd.read_csv(pd.compat.StringIO(d), sep='\s+')
Run Code Online (Sandbox Code Playgroud)

的最新版本pandas已删除该compat模块以及 Python 2 支持。