Замените Значения На Groupby

#python #pandas #lambda #replace

Вопрос:

У меня есть фрейм данных со столбцами чисел, один из которых содержит некоторые значения «tbd». Я хочу заменить эти значения «tbd» средними значениями из группы по другим столбцам. Я понимаю, что вы можете заполнить значения, используя следующее

 df['col_d'] = df.groupby(['col_a', 'col_b'])['col_c'].transform(lambda x: x.fillna(x.round().mean()))  

Я не могу использовать fillna, хотя, поскольку у меня уже есть значения na, и я не хочу отбрасывать их и добавлять, так как они понадобятся мне на более позднем этапе. Я понимаю, что мог бы использовать сопоставление, но мне интересно, есть ли более элегантный метод замены?

Вход col_b содержит NaNs и «tbd». Я хочу использовать группу col_a и col_c для заполнения «tbd».

 col_a col_b col_c  1 1 1  2 2 2  3 'tbd' 3  3 'tbd' 3  5 5 5  6 NaN 6  

на выходе использовалось среднее значение col_a и col_c

 col_a col_b col_c  1 1 1  2 2 2  6 7 8  5 6 7  5 5 5  6 NaN 6   

простой пример, но я считаю, что это объясняет проблему, по сути, это замена метода fillna в примере лямбда-функции, которую я перечислил, методом замены вместо этого

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

1. Трудно понять, что вам здесь нужно. Пример ввода и желаемый результат будут иметь большое значение для разъяснения этого

2. @PaulH, конечно, секундочку

Ответ №1:

Вы можете использовать np.where и использовать to_numeric для изменения на nan «tbd», чтобы иметь возможность выполнять среднюю операцию.

 # dummy data df = pd.DataFrame({  'col_a':['a']*8, 'col_b':['b','c']*4,  'col_c':[1,1,np.nan,np.nan,'tbd',3,4,'tbd'] })  df['col_d'] = np.where(  df['col_c'].eq('tbd'),   pd.to_numeric(df['col_c'], errors='coerce')  .groupby([df['col_a'],df['col_b']]).transform('mean'),   df['col_c'] )  print(df) # col_a col_b col_c col_d # 0 a b 1 1 # 1 a c 1 1 # 2 a b NaN NaN # 3 a c NaN NaN # 4 a b tbd 2.5 # 5 a c 3 3 # 6 a b 4 4 # 7 a c tbd 2.0