【问题标题】:Pandas erratically returning TypeError cannot do slice indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [310] of <class 'int'>Pandas 异常返回 TypeError 无法使用 <class 'int'> 的这些索引器 [310] 对 <class 'pandas.core.indexes.base.Index'> 进行切片索引
【发布时间】:2018-05-03 00:12:47
【问题描述】:

我对 pandas 有一个非常奇怪的问题 - 我正在尝试从数据框中提取一列值以进行下游分析。我编写的脚本一次迭代许多文件来执行此操作。每个文件都是使用 bam-readcounts 上的相同命令创建的,并包含 DNA 测序运行的读取深度数据。

有时,它像梦一样工作并返回我需要返回的所有内容,其他时候我收到错误消息:

TypeError: cannot do slice indexing on <class 'pandas.core.indexes.base.Index'> with these indexers [310] of <class 'int'>

该列肯定包含整数 - 为了确定,我尝试使用浮点数和 str 运行脚本。

我什至在没有更改脚本代码的情况下每隔几分钟分析同一组文件并让 pandas 返回错误消息的实例。我曾有过使用 bam-headcount 分析同时创建的两批文件的实例,并让它在一批中返回错误消息,但在另一批中不返回。

相关的代码是:

col_names = ['Col_' + str(i) for i in range(1, max_col_nr)]

df = pd.read_csv(myFile, sep = '\t', names = col_names)
df2 = df.set_index("Col_2", drop = False)
df3 = (df2.loc[310:400,"Col_4"])
US_Av = (int(round(df4.mean())))

我从来没有遇到过这样的情况,即同一段代码在运行时会改变其行为,如果有人有任何建议,我将不胜感激。这让我有点发疯。

以下示例数据供参考。这是我试图获得平均值的第 4 列。

GRIN2A  280 A   169     
GRIN2A  281 C   169 
GRIN2A  282 C   172
GRIN2A  283 T   171 

【问题讨论】:

  • 所有文件的编码都是一样的吗?它们都有相同的行尾吗?
  • 是的,它们是使用 bam-headcount 同时制作的,它从基因组比对文件中创建了一个制表符分隔的数据表。我有三个文件文件夹,每个文件夹最初都使用不同的对齐器(bwa-ont、minimap2 和 ngmlr)与参考序列对齐。 nglmrs 处理得很好,但其他两个不是。事情是... minimap2s 今天早些时候处理得很好。然后他们没有,然后他们又做了,现在他们没有了。我没有以任何方式更改运行的脚本。
  • 嗯...好吧,我在导致错误的代码行附近设置了一个打印(文件)。迭代器正在毫无问题地浏览一些文件,然后努力在每个文件夹中使用一对夫妇进行操作。我找不到它正在努力解决的文件之间的任何共同问题(或者实际上,在问题文件和其他文件之间)。从文件夹中删除文件可以解决问题,但我每次都会丢失几个文件的数据。有兴趣知道是否有其他人曾经有过这种情况 - 因为我有点好奇,所以现在将问题悬而未决。
  • 有没有专门设置Col_2dtype?我在您的代码中没有看到任何地方。

标签: python python-3.x pandas


【解决方案1】:

我想我明白了——你在 dtype 上是正确的。在失败的文件中,pandas 错误地标记了列。 pd 的正确结果应该是

df =
      Col_1  Col_2 Col_3  Col_4  
0    GRIN2A    280     A     44   
1    GRIN2A    281     C     44   
2    GRIN2A    282     C     44 

对于某些文件,相同的代码会导致

df =
        Col_1 Col_2  Col_3
GRIN2A    280     A     46
GRIN2A    281     A     46
GRIN2A    282     A     46

这意味着,对于发生这种情况的文件,索引 Col_2 是 str 而不是 int,从而导致错误消息。

我终其一生都无法弄清楚为什么 pandas 在某些文件中的列标题错误,但在其他文件中却没有(超过 300 个文件,每次迭代 2 或 3 个)。通过在我排序的 bam 文件上运行相同的 bam-readcount 迭代器,这些文件具有相同的格式和创建。

包含 pandas 的代码也由迭代器运行,因此每个文件都是相同的。

我可以使用类似...的东西来解决问题

if Col2 is (int): 
elif Col1 is (int): 

有点笨拙,并没有解决根本问题,但至少我不会丢失错误标题文件中的数据。如果有人知道为什么会发生这种情况,我很想听听 cmets。

感谢 RCA 的帮助

【讨论】:

    【解决方案2】:

    您可以通过几种方式显式设置dtypes,这样可以避免使用 if 语句。

    首先是在读取文件时设置类型,如下所示:

    df = pd.read_csv(myFile,
                     sep = '\t',
                     names = col_names,
                     dtype = {<column name>: np.int32, ...}) # note that you'll need numpy imported
    

    这显然只有在您提前知道您的列是什么类型时才有效。 read_csv 的文档有更多信息 - 您也可以只设置一些列,或者告诉 pandas 跳过对整个文件的解释(如果您尝试以下选项,您会想要这样做)。

    下一个选项是使用to_numeric,这将在您将其设为索引之前强制该系列。这可能是最简单的方法。

    df = pd.read_csv(myFile, sep = '\t', names = col_names)
    df["Col_2"] = pd.to_numeric(df["Col_2"])
    df2 = df.set_index("Col_2", drop = False)
    df3 = (df2.loc[310:400,"Col_4"])
    US_Av = (int(round(df4.mean())))
    

    然后,最后是单行版本:

    df = pd.read_csv(myFile, sep = '\t', names = col_names)
    df2 = df.set_index(df.Col_2.as_type(int), drop = False)
    df3 = (df2.loc[310:400,"Col_4"])
    US_Av = (int(round(df4.mean())))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-13
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      相关资源
      最近更新 更多