#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. Рад, что это помогло, не стесняйтесь проголосовать и принять в качестве ответа, если это помогло 🙂