所以我试着运行一个我以前开发的代码,它已经用pandas很好地运行了很多次。在
我的dataframe有一个自定义索引(使用唯一的字符串值作为索引,表示一个唯一的标识符,在本例中是单个蛋白质),文件名作为列。然后我使用一个迭代过程将计数分配给数据帧中的一些单元格。所以,假设我有一个默认字典(my_dict),它有一个给定的缩写键,值是[filename,protein,count]。在
我有一个文件名的分类列表,和一个蛋白质的分类列表,分别称为allfilenames和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不返回正确的文件名。在
为了测试,我在数据帧上做了以下操作:
^{pr2}$我尝试过df[my_filename].ix[my_protein]、df[my_filename].loc[my_protein],甚至创建了一个自定义索引。在
通常这个脚本运行得很好。我的文件名通常类似于: beta_maxi070214_08,因此没有空格或没有ASCII字符。在
我的蛋白质名称都是标准的,所有的名字要么在UniProtKB数据库中,要么是两种蛋白质之间的联系(即ACACA-acacab)。在
我不太清楚发生了什么事。有人有什么建议吗?在
编辑: 下面是一个例子:
>>> 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
>>>
尝试:
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相关问题 更多 >
编程相关推荐