Замена значения 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 не повторяется в двух последовательных строках. Вывод выглядит следующим образом:
- Точность потеряна при использовании read_csv в пандах
- как применить функцию к нескольким столбцам в кадре данных pandas за один раз
- Панды: построение двух гистограмм на одном и том же участке
- pandas dataframe - удалить значения из группы с меньшим, чем X строк
- найти набор индексов столбцов для ненулевых значений в каждой строке в кадре данных pandas
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")
- Специализация битового поля в python
- Оболочка PowerShell для прямого ввода по каналам в сценарий Python