2016-02-26 4 views
2

Может кто-нибудь сказать мне, почему в мой цикл.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 заполняет указанную ячейку, даже если столбец упомянутой во второй части, если заявление не ноль? Я пытаюсь использовать .fillna ТОЛЬКО, если обе ячейки, упомянутые в моей инструкции if, равны нулю.

Я также попытался сменить вторую на последнюю строку на df_all.infraspecific_name[row].fillna('NA', inplace=True), которая тоже не работает.

df_all.loc[row,['infraspecific_name']].fillna('NA', inplace=True) исправляет проблему, но тогда, когда обе клетки infraspecific_name и isolate равны нулю, не заполняет ячейки с «NA»

Я не уверен, если мое отсутствие понимания в Python петли или панд ,

файл .csv Я использую можно найти на ftp://ftp.ncbi.nlm.nih.gov/genomes/genbank/bacteria/assembly_summary.txt

ответ

1

Поскольку вы индексировать ваши первые седловины, вы могли бы использовать update:

df_all['infraspecific_name'] 

Возвращает серии только указанный столбец. Ниже будет выполнять .fillna только на некоторых (элементов) строк [where condition True]

[(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 

Остальная часть dataframe должен быть цельным.

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) выясняется, имеют ли все столбцы в каждой строке значения Truth.

4-я строка использует эту маску для определения местоположения значений, которые необходимо изменить.

Смежные вопросы