2016-02-26 76 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行使用该掩码来查找需要更改的值的位置。