Я пытаюсь понять, как преобразовать лямбда-функцию в обычную. У меня есть эта лямбда-функция, которая должна заполнять нулевые значения каждого столбца режимом
def fill_nn(data):
df= data.apply(lambda column: column.fillna(column.mode()[0]))
return df
Я пробовал это:
def fill_nn(df):
for column in df:
if df[column].isnull().any():
return df[column].fillna(df[column].mode()[0])
Нет необходимости в if
. Если нулевых значений нет, fillna()
ничего не сделает.
Лямбда-выражение lambda <args>: <expression>
всегда эквивалентно def name(<args>): return <expression>
@juanpa.arrivillaga Вы отвечаете на заголовок, а не на вопрос. Она пытается полностью отказаться от использования apply()
.
@Barmar В этом случае я хочу заменить нулевые значения столбца (если есть) режимом, но если нет нулевых значений, будут сохранены те, которые уже есть
Вот что делает fillna()
. Он оставляет все ненулевые значения в покое. Если нулевых значений нет, весь столбец остается без изменений. Так что проверка перед вызовом не нужна.
Привет 👋 Надеюсь у тебя все хорошо!
Если я правильно понял ваш вопрос, то наилучший способ будет похож на этот:
import pandas as pd
def fill_missing_values(series: pd.Series) -> pd.Series:
"""Fill missing values in series/column."""
value_to_use = series.mode()[0]
return series.fillna(value=value_to_use)
df = pd.DataFrame(
{
"A": [1, 2, 3, 4, 5],
"B": [None, 2, 3, 4, None],
"C": [None, None, 3, 4, None],
}
)
df = df.apply(fill_missing_values) # type: ignore
print(df)
# A B C
# 0 1 2.0 3.0
# 1 2 2.0 3.0
# 2 3 3.0 3.0
# 3 4 4.0 4.0
# 4 5 2.0 3.0
но лично я бы все равно использовал lambda
, так как он требует меньше кода и его легче обрабатывать (особенно для такой небольшой задачи).
Было бы просто
def func(column): return column.fillna(column.mode()[0])