如何使用 Pandas read_clipboard 有效地加载有关 Stack Overflow 问题的数据?
How can I effectively load data on Stack Overflow questions using Pandas read_clipboard?
我注意到 Stack Overflow 上的很多 Pandas 问题只包含几行数据作为文本,没有 generate/reproduce 的随附代码。我知道 read_clipboard
的存在,但我无法弄清楚在许多情况下如何有效地调用此函数来读取数据,例如当 header 名称中有空格时,或者Python objects 比如列中的列表。
我如何才能更有效地使用 pd.read_clipboard
来读取以非常规格式粘贴的数据,这些格式不适合使用默认参数轻松阅读?是否存在 read_clipboard
不足的情况?
read_clipboard
:初学者指南
read_clipboard
is truly a saving grace for anyone starting out to answer questions in the Pandas tag。不幸的是,pandas 退伍军人也知道,由于所发布数据格式的各种复杂性,问题中提供的数据并不总是很容易进入终端。
值得庆幸的是,read_clipboard
的论据使处理大多数此类情况成为可能(并且容易)。以下是一些常见的用例及其相应的参数。
常见用例
read_clipboard
在后台使用 read_csv
和白色 space 分隔符,所以很多从 CSV 解析数据的技术都适用于这里,例如
正在解析数据中包含 space 的列
使用 sep
和正则表达式参数。首先,确保列之间至少有两个 space,并且列数据本身内部最多有一个连续的白色 space。然后你可以使用 sep=r'\s{2,}'
,这意味着“通过寻找至少两个连续的白色 space 作为分隔符来分隔列”(注意:engine='python'
是多字符或正则表达式分隔符所必需的):
df = pd.read_clipboard(..., sep=r'\s{2,}', engine='python')
另见 How do you handle column names having spaces in them when using pd.read_clipboard?。
读取系列而不是 DataFrame
使用squeeze=true
,如果第一行也是数据,你可能还需要header=None
。
s = pd.read_clipboard(..., header=None, squeeze=True)
另见 Could there be an easier way to use pandas read_clipboard to read a Series?。
正在使用自定义 header 名称加载数据
将 names=[...]
与 header=None
和 skiprows=[0]
结合使用以忽略现有的 header。
df = pd.read_clipboard(..., header=None, names=['a', 'b', 'c'], skiprows=[0])
正在加载数据,没有任何 headers
- 使用
header=None
设置一个或多个列作为索引
- 使用
index_col=[...]
和适当的标签或索引
解析日期
- 使用
parse_dates
和适当的格式。如果解析 datetimes
(即,日期由时间戳分隔的列),您可能还需要使用 sep=r'\s{2,}'
,同时确保您的列至少由两个 space 分隔。
有关 read_csv
此处未涵盖的其他情况的参数的更全面列表,请参阅 this answer by me。
注意事项
read_clipboard
是一把瑞士军刀。然而,它
无法读取 prettytable/tabulate 格式的数据(IOW,边框使其更难读取)
- 有关解决此问题的解决方案,请参阅 Reading in a pretty-printed/formatted dataframe using pd.read_clipboard?。
除非指定索引中的所有元素,否则无法正确解析 MultIndexes。
- 有关解决此问题的解决方案,请参阅 Copying MultiIndex dataframes with pd.read_clipboard?。
数据中不能ignore/handle省略号
- 我建议的方法是在打印前手动删除省略号
无法将列表列(或其他 objects)解析为字符串以外的任何内容。这些列将需要单独转换,如 How do you read in a dataframe with lists using pd.read_clipboard?.
所示
无法从图片中读取文本(所以请不要使用图片作为与他人分享您的数据的方式!)
这个函数的一个弱点是如果复制是从PDF 文件。以这种方式测试它会导致读取为空。
但是通过使用普通的文本编辑器,一切都很好。这是一个使用随机键入文本的示例:
>>> pd.read_clipboard()
Empty DataFrame
Columns: [sfsesfsdsxcvfsdf]
Index: []
我注意到 Stack Overflow 上的很多 Pandas 问题只包含几行数据作为文本,没有 generate/reproduce 的随附代码。我知道 read_clipboard
的存在,但我无法弄清楚在许多情况下如何有效地调用此函数来读取数据,例如当 header 名称中有空格时,或者Python objects 比如列中的列表。
我如何才能更有效地使用 pd.read_clipboard
来读取以非常规格式粘贴的数据,这些格式不适合使用默认参数轻松阅读?是否存在 read_clipboard
不足的情况?
read_clipboard
:初学者指南
read_clipboard
is truly a saving grace for anyone starting out to answer questions in the Pandas tag。不幸的是,pandas 退伍军人也知道,由于所发布数据格式的各种复杂性,问题中提供的数据并不总是很容易进入终端。
值得庆幸的是,read_clipboard
的论据使处理大多数此类情况成为可能(并且容易)。以下是一些常见的用例及其相应的参数。
常见用例
read_clipboard
在后台使用 read_csv
和白色 space 分隔符,所以很多从 CSV 解析数据的技术都适用于这里,例如
正在解析数据中包含 space 的列
使用
sep
和正则表达式参数。首先,确保列之间至少有两个 space,并且列数据本身内部最多有一个连续的白色 space。然后你可以使用sep=r'\s{2,}'
,这意味着“通过寻找至少两个连续的白色 space 作为分隔符来分隔列”(注意:engine='python'
是多字符或正则表达式分隔符所必需的):df = pd.read_clipboard(..., sep=r'\s{2,}', engine='python')
另见 How do you handle column names having spaces in them when using pd.read_clipboard?。
读取系列而不是 DataFrame
使用
squeeze=true
,如果第一行也是数据,你可能还需要header=None
。s = pd.read_clipboard(..., header=None, squeeze=True)
另见 Could there be an easier way to use pandas read_clipboard to read a Series?。
正在使用自定义 header 名称加载数据
将
names=[...]
与header=None
和skiprows=[0]
结合使用以忽略现有的 header。df = pd.read_clipboard(..., header=None, names=['a', 'b', 'c'], skiprows=[0])
正在加载数据,没有任何 headers
- 使用
header=None
- 使用
设置一个或多个列作为索引
- 使用
index_col=[...]
和适当的标签或索引
- 使用
解析日期
- 使用
parse_dates
和适当的格式。如果解析datetimes
(即,日期由时间戳分隔的列),您可能还需要使用sep=r'\s{2,}'
,同时确保您的列至少由两个 space 分隔。
- 使用
有关 read_csv
此处未涵盖的其他情况的参数的更全面列表,请参阅 this answer by me。
注意事项
read_clipboard
是一把瑞士军刀。然而,它
无法读取 prettytable/tabulate 格式的数据(IOW,边框使其更难读取)
- 有关解决此问题的解决方案,请参阅 Reading in a pretty-printed/formatted dataframe using pd.read_clipboard?。
除非指定索引中的所有元素,否则无法正确解析 MultIndexes。
- 有关解决此问题的解决方案,请参阅 Copying MultiIndex dataframes with pd.read_clipboard?。
数据中不能ignore/handle省略号
- 我建议的方法是在打印前手动删除省略号
无法将列表列(或其他 objects)解析为字符串以外的任何内容。这些列将需要单独转换,如 How do you read in a dataframe with lists using pd.read_clipboard?.
所示无法从图片中读取文本(所以请不要使用图片作为与他人分享您的数据的方式!)
这个函数的一个弱点是如果复制是从PDF 文件。以这种方式测试它会导致读取为空。
但是通过使用普通的文本编辑器,一切都很好。这是一个使用随机键入文本的示例:
>>> pd.read_clipboard()
Empty DataFrame
Columns: [sfsesfsdsxcvfsdf]
Index: []