Массовая замена значения в фрейме данных pandas, когда столбец имеет повторяющиеся значения, а значение поступает из функции

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных pandas df со следующим типом данных:

  ------ ------ -- 
| Col1 | Col2 |  |
 ------ ------ -- 
| abc  |  123 |  |
| abc  |  234 |  |
| cde  |  123 |  |
| cde  |  234 |  |
| ghi  |  455 |  |
| ghi  |  755 |  |
| ghi  |  123 |  |
 ------ ------ -- 
  

В другом месте у меня есть функция, которая принимает значение из фрейма данных в качестве входных данных. Так, например, my_func(arg1, arg2, str_from_df) . Что я хотел бы сделать, так это заменить значения в Col1 на возвращаемое значение, my_func когда my_func return не None является . Один из способов сделать это — перебирать фрейм данных и изменять каждое значение в Col1 по одному за раз. Но это очень медленное решение. В моем случае это также неэффективно, потому что мне нужно вернуть значение только одного вызова для my_func каждой группы Col1 .

Могу ли я изменить все abc Col1 одновременно? То есть проверьте, например, my_func(arg1, arg2, df['Col2'].iat[0]) является None ли (значение, соответствующее первому экземпляру abc in Col2 ), и если нет, используйте его значение для замены ВСЕХ abc значений Col1 . Фрейм данных близок к 1 миллиметру строк, и сама функция не является незначительной, поэтому я хотел бы вызывать ее как можно реже. Я также должен упомянуть, что я хочу, чтобы другие данные оставались нетронутыми. Можно ли это сделать? Может lambda быть, функция?

Ответ №1:

Поскольку вы хотите применить функцию к группе строк, имеющих одинаковое значение col1 , вы можете использовать groupby() и transform()

  df['Col1'] = df.groupby('Col1')['Col2'].transform(my_func)
  

Кроме того, что касается None Col1 значения vs, вы можете обработать его внутри my_func подобного

 def my_func(e):

  
  result = #your logic
  return result if result!=None else e 
  

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

1. Извините, я не думаю, что я совсем понимаю синтаксис. Как я передаю аргументы my_func из этого синтаксиса?

2. Вы можете передавать столбцы, в этом случае будет передан ‘Col1` (см. Обновленный ответ), вам нужны дополнительные аргументы? Я не думаю, что вам понадобится, поскольку они будут статическими переменными и не будут иметь ничего общего со строкой

3. Похоже, это сработало, спасибо! Я получил еще одну ошибку AttributeError, которая, как я думаю, связана с моей функцией, а не с вашим решением, поэтому я отмечу ее как ответ.

4. Рад, что это помогло, не стесняйтесь проголосовать и принять в качестве ответа, если это помогло 🙂