使用 pd.read_clipboard 时如何处理包含空格的列名?

Posted

技术标签:

【中文标题】使用 pd.read_clipboard 时如何处理包含空格的列名?【英文标题】:How do you handle column names having spaces in them when using pd.read_clipboard? 【发布时间】:2018-01-13 15:43:38 【问题描述】:

这是我长期面临的一个真正问题。

获取这个数据框:

         A         B  THRESHOLD
       NaN       NaN        NaN
 -0.041158 -0.161571   0.329038
  0.238156  0.525878   0.110370
  0.606738  0.854177  -0.095147
  0.200166  0.385453   0.166235

使用pd.read_clipboard 很容易复制。但是,如果其中一个列名有空格:

         A         B     Col #3
       NaN       NaN        NaN
 -0.041158 -0.161571   0.329038
  0.238156  0.525878   0.110370
  0.606738  0.854177  -0.095147
  0.200166  0.385453   0.166235

然后,它是这样读的:

          A         B       Col  #3
0       NaN       NaN       NaN NaN
1 -0.041158 -0.161571  0.329038 NaN
2  0.238156  0.525878  0.110370 NaN
3  0.606738  0.854177 -0.095147 NaN
4  0.200166  0.385453  0.166235 NaN

我怎样才能防止这种情况发生?

【问题讨论】:

我通常会尝试确保列被多个空格分隔。这样,我可以使用df = pd.read_clipboard(header=0, sep="\s2,", engine="python") 之类的东西。 atom 和 sublime text 都允许您在正则表达式中搜索和替换;这应该会有所帮助。 @Abdou 谢谢,这是有道理的。 我一直想知道其他人如何处理这些问题。感谢您将其转化为问题。 @Abdou 是的...pd.read_clipboard 是每个人都在使用但没人谈论的工具...哈哈 【参考方案1】:

在这种情况下,我所做的是将所有列分开两个或多个空格,然后我使用 sep='\s\s+' 作为分隔符,这样当我确实有带有单个空格的列标题时因为,它上面的第 3 列将其视为一列。

         A         B     Col #3
       NaN       NaN        NaN
 -0.041158  -0.161571   0.329038
  0.238156   0.525878   0.110370
  0.606738   0.854177  -0.095147
  0.200166   0.385453   0.166235

df = pd.read_clipboard(sep='\s\s+')

您确实收到此警告,但您可以忽略它,因为它做得对。或者,如果您的强迫症能胜过您,您可以输入engine='python'。 :)

C:\程序 文件\Anaconda3\lib\site-packages\pandas\io\clipboards.py:63: ParserWarning:回退到“python”引擎,因为“c” 引擎不支持正则表达式分隔符(分隔符 > 1 char 和 不同于 '\s+' 被解释为正则表达式);你可以避免这种情况 通过指定 engine='python' 发出警告。返回 read_table(StringIO(text), sep=sep, **kwargs)

print(df)

          A         B    Col #3
0       NaN       NaN       NaN
1 -0.041158 -0.161571  0.329038
2  0.238156  0.525878  0.110370
3  0.606738  0.854177 -0.095147
4  0.200166  0.385453  0.166235

【讨论】:

当你说你让它们分开 2 个空格时,你的意思是你将它粘贴到记事本中并手动输入这些空格? 好吧,这与 Abdou 所说的相似,而且很有道理。我有更多问题会在以后的问题中提出,但这个答案解决了这个问题,所以谢谢。 @cᴏʟᴅsᴘᴇᴇᴅ 通常,当我看到标题带有空格或带有时间的日期时,我总是输入 sep='\s\s+',因为通常有日期空间时间,这被视为单列.【参考方案2】:

使用 reiopd.read_table 来推动我在 cmets 中提出的观点,我复制了您在帖子中的确切文本,应用了第一轮 re.sub 以删除任何前导空格.然后,我用 2 个空格替换了前面有数字的任何空格——这是手头的情况所独有的,因为列名主要是字符串字符。完成所有这些后,我将生成的字符串转换为 io.StringIO 对象并将后者提供给 pd.read_table 函数。这与复制文本并将其粘贴到sublime text,然后在最终复制结果字符串并将其提供给pd.read_clipboard 之前应用搜索和替换操作基本相同。

下面的sn-p代码说明了这一点:

import pandas as pd
import re
import io


text = """         A         B     Col #3
        NaN       NaN        NaN
  -0.041158 -0.161571   0.329038
   0.238156  0.525878   0.110370
   0.606738  0.854177  -0.095147
   0.200166  0.385453   0.166235"""


with io.StringIO(re.sub("(?<=[0-9]) +", "  ", re.sub("^ +", "", text))) as fs:
    df =  pd.read_table(fs, header=0, sep="\s2,",engine='python')


#           A         B    Col #3
# 0       NaN       NaN       NaN
# 1 -0.041158 -0.161571  0.329038
# 2  0.238156  0.525878  0.110370
# 3  0.606738  0.854177 -0.095147
# 4  0.200166  0.385453  0.166235

感谢您提出问题。

【讨论】:

以上是关于使用 pd.read_clipboard 时如何处理包含空格的列名?的主要内容,如果未能解决你的问题,请参考以下文章

使用 pd.read_clipboard 时如何处理包含空格的列名?

使用 pd.read_clipboard 复制数据帧时如何处理自定义命名索引?

来自云托管的 jupyter 的 pandas.read_clipboard?

读取剪贴板在 jupyter 或终端中不起作用

如何从 matplotlib 中的数据框列生成 x 轴值?

pandas-20 DataFrame()的基本操作