Замена значения NaN словом, когда NaN не повторяется в двух последовательных строках

для следующего фрейма данных:

index Sent col_1 col_2 col_3 1 AB NaN DD CC 1 0 1 0 2 SA FA FB NaN 2 1 1 NaN 3 FF Sha NaN PA 3 1 0 1 

Мне нужно заменить значение NAN в col_1, col_2, col_3 на «F», когда NAN не повторяется в двух последовательных строках. Вывод выглядит следующим образом:

  index Sent col_1 col_2 col_3 1 AB F DD CC 1 0 1 0 2 SA FA FB NaN 2 1 1 NaN 3 FF Sha F PA 3 1 0 1 This is my code: for col in ['col_1', 'col_2', 'col_3']: data = np.reshape(df[col].values, (-1, 2)) need_fill = np.logical_and(data[:, 0] == '', data[:, 1] != '') data[np.where(need_fill),1] = 'F' 

Но он заменяет значение 0 под NAN значением F. Как я могу исправить код для замены NAN на F.

One Solution collect form web for “Замена значения NaN словом, когда NaN не повторяется в двух последовательных строках”

Может быть, есть что-то лучше, но один из способов – попытаться использовать shift чтобы увидеть row выше и row ниже. Однако для первой и последней строки это создало бы проблему. Таким образом, если нет необходимости добавлять дополнительные строки и удалять их позже, вы можете попробовать следующее:

 # Appending row to the top: https://stackoverflow.com/a/24284680/5916727 df.loc[-1] = [0 for n in range(len(df.columns))] df.index = df.index + 1 # shifting index df = df.sort_index() # sorting by index # Append row to below it df.loc[df.shape[0]] = [0 for n in range(len(df.columns))] print(df) index Sent col_1 col_2 col_3 0 0 0 0 0 0 1 1 AB NaN DD CC 2 1 0 1 0 3 2 SA FA FB NaN 4 2 1 1 NaN 5 3 FF Sha NaN PA 6 3 1 0 1 7 0 0 0 0 0 

Теперь проверьте последовательные строки, используя shift с masking shift(-1) и shift(1) :

 columns = ["col_1", "col_2","col_3"] for column in columns: df.loc[df[column].isnull() & df[column].shift(-1).notnull() & df[column].shift(1).notnull(), column] = "F" df = df [1:-1] # remove extra rows print(df) 

Вывод:

  index Sent col_1 col_2 col_3 1 1 AB F DD CC 2 1 0 1 0 3 2 SA FA FB NaN 4 2 1 1 NaN 5 3 FF Sha F PA 6 3 1 0 1 

Если вы хотите, вы также можете удалить дополнительный index столбец, который, похоже, дублирует.

Обновление (добавление данных CSV, прошедших проверку)

В тестовом csv файле у меня было следующее.

 index,Sent,col_1,col_2,col_3 1,AB,,DD,CC 1, ,0,1,0 2,SA,FA,FB,NA 2, ,1,1,NA 3,FF,Sha,,PA 3, ,1,0,1 

Затем вы можете использовать следующие для создания входных данных:

 import pandas as pd df = pd.read_csv("FILENAME.csv") 
  • найти числовые столбцы в pandas (python)
  • Как обновить подмножество MultiIndexed pandas DataFrame
  • AttributeError: объект модуля не имеет атрибута «Серии». Код работает в iPython
  • Измените код повторной выборки OHLC в соответствии с устаревшим предупреждением
  • Найти строки с подмножеством значений в другой DataFrame в векторном виде
  • Преобразование данных в Pandas в строку csv
  • Python Pandas: Почему numpy намного быстрее, чем Pandas для назначения столбцов? Могу ли я еще больше оптимизировать?
  • Python эквивалент функции головы и хвоста R
  • Python - лучший язык программирования в мире.