Объединение в цепочку трех операторов pandas

#python #pandas

#python #pandas

Вопрос:

Возможно ли объединить следующие три оператора в один?

 raw_df = df.copy().astype({'ids': 'str'})
raw_df['dels'] = np.where(raw_df['dels'] == 'nan', None, raw_df['dels'])
raw_df['langs'] = np.where(raw_df['langs'] == 'nan', None, raw_df['langs'])
  

Если да, то как это можно сделать?

Ответ №1:

Вы можете использовать этот assign метод для создания новых столбцов / перезаписи существующих столбцов. Вы также можете сократить логику здесь с np.where помощью Series.mask (или Series.replace ), поскольку все, что вы хотите сделать, это поменять наш 'nan' на None и оставить остальную часть столбца нетронутой.

Не видя копии ваших данных, я не могу быть уверен, что это сработает, но вы можете попробовать:

 new_df = (raw_df.copy()
          .astype({"ids": "str"})
          .assign(
              dels=lambda df: df["dels"].mask(df["dels"] == 'nan', None),
              langs=lambda df: df["langs"].mask(df["langs"] == 'nan', None))
         )
  

В качестве альтернативы, если вы просто хотите продолжить и заменить 'nan' for None по всему фрейму данных (а не только по 2 столбцам), вы можете сделать это следующим образом:

 new_df = (raw_df.copy()
          .astype({"ids": "str"})
          .replace("nan", None))
  

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

1. спасибо за это, почему вы окружаете это утверждение (...) ?

2. Я заключаю оператор в круглые скобки, потому что мне удобнее читать связанные операции, если каждая из них находится в отдельной строке. Вы также можете использовать обратную косую черту в конце каждой строки для достижения того же результата, но я нахожу использование круглых скобок более привлекательным, поскольку это позволяет избежать большого количества обратных косых черт в вашем коде. У Тома Аугспургера (основного разработчика pandas) есть отличный пост в блоге о цепочке методов , который я настоятельно рекомендую всем.