#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
, но я не смог заставить их работать.