2014-10-22 78 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