如何将 Stack Overflow 中的 copy/paste DataFrame 转换为 Python
How to copy/paste DataFrame from Stack Overflow into Python
在 questions and 中,用户经常 post 他们的 question/answer 使用的示例 DataFrame
:
In []: x
Out[]:
bar foo
0 4 1
1 5 2
2 6 3
能够将此 DataFrame
放入我的 Python 解释器中非常有用,这样我就可以开始调试问题或测试答案。
我该怎么做?
Pandas 是真正了解人们想要做什么的人写的。
Since version 0.13
there's a function pd.read_clipboard
这在 "just work".
方面非常有效
复制并粘贴问题中以 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
注意事项
- 不要包含 iPython
In
或 Out
内容,否则将无法正常工作
- 如果您有命名索引,目前需要添加
engine='python'
(请参阅 GitHub 上的 this issue)。 '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
哪个根本不起作用,或者这个:
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
有效,但 returns 完全不正确!
pd.read_clipboard()
很漂亮。但是,如果您在脚本或笔记本中编写代码(并且您希望您的代码在未来工作),它就不太适合。这是 copy/paste 将数据帧输出到新数据帧对象的另一种方法,可确保 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+')
一些注意事项:
- 三引号字符串在输出中保留换行符。
StringIO
将输出包装在一个类似文件的对象中,read_csv
需要。
- 将
sep
设置为 \s+
使得每个连续的空白块都被视为单个分隔符。
更新
以上答案只有Python3个。如果您卡在 Python 2,请替换导入行:
from io import StringIO
改为:
from StringIO import StringIO
如果您有旧版本的 pandas
(v0.24
或更早版本),有一种简单的方法可以编写上述代码的 Py2/Py3 兼容版本:
import pandas as pd
d = ...
df = pd.read_csv(pd.compat.StringIO(d), sep='\s+')
最新版本的 pandas
已删除 compat
模块以及 Python 2 支持。
如果您从具有如下标准条目的 CSV 文件复制粘贴:
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"})
将为您提供正确定义的 pandas 数据框。
在 questions and DataFrame
:
In []: x
Out[]:
bar foo
0 4 1
1 5 2
2 6 3
能够将此 DataFrame
放入我的 Python 解释器中非常有用,这样我就可以开始调试问题或测试答案。
我该怎么做?
Pandas 是真正了解人们想要做什么的人写的。
Since version 0.13
there's a function pd.read_clipboard
这在 "just work".
复制并粘贴问题中以 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
注意事项
- 不要包含 iPython
In
或Out
内容,否则将无法正常工作 - 如果您有命名索引,目前需要添加
engine='python'
(请参阅 GitHub 上的 this issue)。 '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
哪个根本不起作用,或者这个:
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
有效,但 returns 完全不正确!
pd.read_clipboard()
很漂亮。但是,如果您在脚本或笔记本中编写代码(并且您希望您的代码在未来工作),它就不太适合。这是 copy/paste 将数据帧输出到新数据帧对象的另一种方法,可确保 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+')
一些注意事项:
- 三引号字符串在输出中保留换行符。
StringIO
将输出包装在一个类似文件的对象中,read_csv
需要。- 将
sep
设置为\s+
使得每个连续的空白块都被视为单个分隔符。
更新
以上答案只有Python3个。如果您卡在 Python 2,请替换导入行:
from io import StringIO
改为:
from StringIO import StringIO
如果您有旧版本的 pandas
(v0.24
或更早版本),有一种简单的方法可以编写上述代码的 Py2/Py3 兼容版本:
import pandas as pd
d = ...
df = pd.read_csv(pd.compat.StringIO(d), sep='\s+')
最新版本的 pandas
已删除 compat
模块以及 Python 2 支持。
如果您从具有如下标准条目的 CSV 文件复制粘贴:
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"})
将为您提供正确定义的 pandas 数据框。