#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