Повторите, чтобы заполнить пустые панды

#pandas #loops #null #iteration

Вопрос:

У меня есть таблица, в которой я хотел бы заполнить некоторые нулевые значения, являющиеся правилом, условием между столбцами. Кусок стола выглядит так:

Мастер ID_A Col_A Col_B Col_C
X 1 a NaN NaN
X 2 g f o
X 3 t s o
Y 4 a d c
Y 5 e r Nan

Моя мысль была:

  • В каждой строке ищите нулевые значения.
  • Когда я найду нуль, найдите другую строку с тем же хозяином и заполните нуль идентификатором ID_A этой строки
    • В этом случае Col_B будет 2, а Col_C будет 3 (первая строка)
    • И Col_C в пятом ряду будет 4

Как я могу это сделать? Мне все еще трудно создавать циклы, но я хотел бы узнать больше! Спасибо

Комментарии:

1. Почему это 2, а не 3 для первого ряда? Вам нужно повторить ID_A все сначала ? Что делать, если в определенной строке больше nan s, чем ID_A ? Перезапустить с 2?

Ответ №1:

Это сделать труднее, чем я думал! Вот способ сделать это с помощью грубой силы:

 import pandas as pd import numpy as np  df = pd.DataFrame({'Master': ['X','X','X','Y','Y'],  'ID_A': range(1,6),  'Col_A': ['a','g','t','a','e'],  'Col_B': [np.nan,'f','s','d','r'],  'Col_C': [np.nan,'o','o','c',np.nan]})  master_vals = df['Master'].unique()  for val in master_vals:  df_master = df[df['Master'] == val]  for row in df_master.index:  counter = 0  for col in ['Col_A','Col_B','Col_C']:  if pd.isnull(df_master.loc[row,col]):  full_df = df_master.dropna()  index = full_df.index  df.loc[row,col] = full_df.loc[index[0] counter,'ID_A']  counter  = 1  

Для каждого из наших основных значений [X,Y] мы выбираем только те строки из фрейма данных, в которые они входят df_master . Затем выполните итерацию по строкам и столбцам , которые нас интересуют df_master , в поисках NANS. Если мы найдем его, то проведем поиск full_df (часть df_master , которая не содержит никаких NAN), и выберем соответствующее значение с помощью счетчика, чтобы помочь индексированию. Это оставляет нас с:

 df  Master ID_A Col_A Col_B Col_C 0 X 1 a 2 3 1 X 2 g f o 2 X 3 t s o 3 Y 4 a d c 4 Y 5 e r 4  

Этот подход может быть очень медленным, если ваш набор данных большой, а также может привести к неожиданному поведению, если ваши данные не структурированы точно так же, как в приведенном примере. Возможно , всю эту задачу можно было бы лучше выполнить с помощью groupby и stack , но я не смог заставить их работать.