如何使用 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

  • 正在使用自定义 header 名称加载数据

    • names=[...]header=Noneskiprows=[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是一把瑞士军刀。然而,它

这个函数的一个弱点是如果复制是从PDF 文件。以这种方式测试它会导致读取为空。

但是通过使用普通的文本编辑器,一切都很好。这是一个使用随机键入文本的示例:

>>> pd.read_clipboard()
Empty DataFrame
Columns: [sfsesfsdsxcvfsdf]
Index: []