2016-02-26 112 views
2
是空

有人可以告訴我爲什麼我在for循環.fillna列如果兩個細胞熊貓

df_all = pd.read_csv("assembly_summary.txt", delimiter='\t', index_col=0) 
for row in df_all.index: 
    if pd.isnull(df_all.infraspecific_name[row]) and pd.isnull(df_all.isolate[row]): 
     df_all.infraspecific_name.fillna('NA', inplace=True) 
     print(df_all[['infraspecific_name', 'isolate']]) 

.fillna罷了,連當列中提到的的第二部分if語句不指定單元格空值? 我試圖只有在我的if語句中引用的兩個單元都爲空時才使用.fillna

我也嘗試將第二行更改爲df_all.infraspecific_name[row].fillna('NA', inplace=True)這也不起作用。

df_all.loc[row,['infraspecific_name']].fillna('NA', inplace=True)解決該問題,但是當兩個單元infraspecific_nameisolate爲null,它不填充「NA」細胞

我不知道如果我缺乏瞭解是在Python環路或熊貓。

我使用該.csv文件可在ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/bacteria/assembly_summary.txt

回答

1

既然你索引你的第一個關口,可以使用update

df_all['infraspecific_name'] 

只返回指定列的系列。下面只會在特定的(元素)行[where condition True]

[(df_all['infraspecific_name'].isnull()) & (df_all['isolate'].isnull())].fillna('NA') 

您可以通過合併上述與update它前面的所有實現在同一行所有的步驟執行.fillna

df_all.update(df_all['infraspecific_name'][(df_all['infraspecific_name'].isnull()) & (df_all['isolate'].isnull())].fillna('NA')) 

行數改變

len(df_all[df_all['infraspecific_name'] == 'NA']) 
1825 

數據幀的其餘部分應完好無損。

1

找到這應該得到你想要的東西

csvfile = 'ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/bacteria/assembly_summary.txt' 
df_all = pd.read_csv(csvfile, delimiter='\t', index_col=0) 
mask = df_all[['infraspecific_name', 'isolate']].isnull().all(axis=1) 
df_all.loc[mask, 'infraspecific_name'] = 'NA' 

3號線使用這些值df_all[['infraspecific_name', 'isolate']]然後爲空.isnull()每個值測試。然後最後一部分.all(axis=1)發現每行中的所有列都有真值。

第4行使用該掩碼來查找需要更改的值的位置。