.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_name
和 isolate
都为空时,它不会用 '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
数据帧的其余部分应该完好无损。
谁能告诉我为什么在我的 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_name
和 isolate
都为空时,它不会用 '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
数据帧的其余部分应该完好无损。