【问题标题】:Glitch in Pandas? Cannot overwrite value熊猫出现故障?无法覆盖值
【发布时间】:2014-12-17 11:43:46
【问题描述】:

所以我尝试运行我之前开发的代码,它已经使用 pandas 很好地运行了很多次。

我的数据框有一个自定义索引(以唯一的字符串值作为索引,代表一个唯一的标识符,在本例中为单个蛋白质),文件名作为列。然后,我使用迭代过程将计数分配给数据框中的某些单元格。所以,假设我有一个带有给定 abritrary 键的默认字典 (my_dict),其值为 [filename, protein, count]。

我有一个排序的文件名列表和一个排序的蛋白质列表,分别称为 all_filenames 和 all_proteins。

 import pandas as pd
 df = pd.DataFrame(index=all_proteins, columns=all_filenames)

 from collections import defaultdict
 my_dict = defaultdict(list)

 ... (Assign values to the dictionary)

 for key in my_dict:
     my_filename = my_dict[key][0]
     my_protein = my_dict[key][1]
     my_count = my_dict[key][2]

     df[my_filename][my_protein] = my_count

但是,每当我打印 df 时,由于某种原因,在这种情况下它会返回完全空白(具有正确的索引和文件名),而通常不会。

所以为了测试,我对数据框做了以下操作:

>>> my_filename in df.columns.tolist()
True
>>> my_protein in df.index.tolist()
True
>>> df[my_filename][my_protein]
nan
>>> my_count
3.0
>>> type(my_count)
<type 'numpy.float64'>
>>> 
>>> df[my_filename][my_protein] = my_count
>>> df[my_filename][my_protein]
nan
>>> 

我尝试过 df[my_filename].ix[my_protein]、df[my_filename].loc[my_protein],甚至创建了自定义索引。

通常这个脚本可以正常工作。我的文件名通常是这样的: beta_maxi070214_08,所以没有空格或ASCII字符。

我的蛋白质名称都是标准的,所有名称要么在 UniProtKB 数据库中,要么是两种蛋白质之间的联系(即 ACACA-ACACB)。

我不太确定发生了什么。有人有什么建议吗?

编辑: 这是一个例子:

>>> my_filename 
'beta_orbi080714_05'
>>> my_protein 
'ACACA:K1316-ACACA:K1363'
>>> my_count 
3.0 
>>> type(my_count) 
<type 'numpy.float64'>
>>> df[my_filename][my_protein] = my_count
>>> df[my_filename][my_protein]
nan
>>> 

【问题讨论】:

  • 什么是 my_column?这是伪代码,还是您正在运行的确切代码? my_column 在哪里定义?
  • 所以我基本上是导入文件列表,然后从文件中提取文件名。在这种情况下,我使用我知道在列表中的文件对其进行了测试。例如,'beta_maxi070214_08' 是一个字符串和一个文件名,是列表 all_filenames 的一个组件(也在列中)。
  • 你没有回答,my_column 是什么?它是在哪里定义的?
  • 对不起,我的错,我会进行编辑。我刚刚注意到(我正在使用可能没有任何意义的数据,如果我将其发布到网上,我的老板会不高兴,所以我会尽快修改)。
  • 您能否至少发布 my_filename my_protein 的值来处理一个给您 NaN 的案例?

标签: python pandas protein-database


【解决方案1】:

尝试: df.ix[my_filename,my_protein] = value

原因(据我了解)是 df['x']['y'] 返回数据框的副本。因此,您正在更改一个值,但您正在更改一个副本的值,而不是放回其中。

编辑:DSM 注释,.loc.iloc 通常比 .ix 更受欢迎,后者具有难以解释的语义。这里有一部分文档专门用于解释所涉及的视图与复制问题http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy

【讨论】:

  • 你是对的,它在正文中是正确的,我粗鲁地复制并粘贴了(对不起,我在发布之前尝试编辑它)。此列表由解析器生成,然后附加到列表(由我使用的代码生成)。我在调试时将列表打印到文件中,效果很好。
  • 非常感谢!它现在确实有效。我仍然对为什么感到困惑,但至少现在我可以拥有更普遍的功能代码。
  • 次要:如今,.loc.iloc 通常比 .ix 更受欢迎,后者具有难以解释的语义。还有一部分文档here 专门用于解释所涉及的视图与复制问题。
  • 注意,谢谢。我对熊猫几乎没有经验,也没有意识到这一点。会看看
  • 完美,感谢帝斯曼。我听说 .ix 与 .loc 相比要慢得多,并且直接返回副本,这就是我之前避免使用它的原因。您展示的文档似乎表明 .loc 比链式 [] 快得多,因此这也应该有助于我加快代码速度。谢谢^_^
猜你喜欢
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
相关资源
最近更新 更多