所以我尝试运行我之前开发的代码,该代码使用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
>>>
答案 0 :(得分:3)
尝试:
df.ix[my_filename,my_protein] = value
这个原因(根据我的理解)是df ['x'] ['y']返回数据框的副本。所以你要更改一个值,但是你正在改变一个副本的值,而不是放回它。
修改:DSM备注,.loc
和.iloc
通常比.ix
更受欢迎,{{1}}具有难以解释的语义。此处有一部分文档专门用于解释所涉及的视图与复制问题http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy