.fillna 列,如果 Pandas 中的两个单元格为空

.fillna column if two cells are empty in Pandas

谁能告诉我为什么在我的 for 循环中

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']])
即使 if 语句的第二部分中引用的列不为空,

.fillna 也会填充指定的单元格? 仅当我的 if 语句中引用的两个单元格都为空时,我才尝试使用 .fillna

我也尝试将倒数第二行更改为 df_all.infraspecific_name[row].fillna('NA', inplace=True) 这也不起作用。

df_all.loc[row,['infraspecific_name']].fillna('NA', inplace=True) 纠正了问题,但是当单元格 infraspecific_nameisolate 都为空时,它不会用 'NA'[=19= 填充单元格]

我不确定我的理解不足是在 Python 循环还是 Pandas 中。

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

找到

这应该能满足您的需求

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

由于您正在为第一个列编制索引,因此您可以使用 update:

df_all['infraspecific_name']

Returns 一个只有指定列的Series。以下将仅在 select(元素)行 [where condition True]

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

您可以通过组合以上内容并在所有步骤之前添加 update 来在一行中完成所有步骤。

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

数据帧的其余部分应该完好无损。