2014-10-22 53 views
2

所以我试着运行一个我之前开发的代码,它使用熊猫很好地运行了很多次。Pandas的故障?无法覆盖值

我的数据帧有一个自定义索引(具有唯一字符串值作为索引,表示唯一标识符,在这种情况下表示单个蛋白质),文件名称作为列。然后,我使用迭代过程为数据框中的某些单元格分配计数。所以,假设我有一个默认的字典(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 
>>> 
+0

什么是my_column?这是伪代码,还是你正在运行的确切代码? my_column在哪里定义? – Parker 2014-10-22 04:45:52

+0

所以我基本上导入一个文件列表,并从文件中提取文件名。在这种情况下,我用一个我知道在列表中的文件来测试它。 例如,'beta_maxi070214_08'是一个字符串和一个文件名,并且是列表all_filenames(也在列中)的一个组件。 – 2014-10-22 04:47:15

+0

你没有回答,什么是my_column?它在哪里定义? – Parker 2014-10-22 04:48:48

回答

3

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

这样做的原因(来自我的理解)是DF [ 'X'] [ 'Y']返回数据框的副本。所以你正在改变一个价值,但你正在改变一个副本的价值,这不会被放回去。

编辑:帝斯曼笔记,.loc.iloc通常优于.ix,它有难以解释的语义。还有一部分文档专门用于解释视图与涉及复制问题http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy

+0

你是正确的,这是正确的,我猥琐复制和粘贴(对不起,我试图在发布前编辑它)。 此列表由解析器生成,然后附加到列表(由我使用的代码生成)。 我已经打印列表文件,而调试时,它运作良好。 – 2014-10-22 04:57:59

+0

已更新的答案。 – Parker 2014-10-22 05:00:19

+0

非常感谢!它现在实际上工作。 我仍然困惑至于为什么,但至少现在我可以更普遍地有一个功能的代码。 – 2014-10-22 05:03:41