Применить функцию к каждой ячейке в DataFrame

87

У меня есть фрейм данных, который может выглядеть так:

A        B        C
foo      bar      foo bar
bar foo  foo      bar

Я хочу просмотреть каждый элемент каждой строки (или каждый элемент каждого столбца) и применить следующую функцию, чтобы получить последующий DF:

def foo_bar(x):
    return x.replace('foo', 'wow')

A        B        C
wow      bar      wow bar
bar wow  wow      bar

Есть ли простой однострочник, который может применить функцию к каждой ячейке?

Это упрощенный пример, поэтому может быть более простой способ выполнить этот конкретный пример, кроме применения функции, но на самом деле я спрашиваю, как применить функцию в каждой ячейке внутри фрейма данных.

eljusticiero67
источник
9
Я не думаю, что было бы неплохо редактировать вопросы на совершенно новый, если у вас уже есть ответы на старый, поскольку это сделало бы недействительными предыдущие ответы на него. Я прошу вас откатить исходный вопрос и задать новый отдельно.
Nickil Maveli,

Ответы:

119

Вы можете использовать то, applymap()что является кратким для вашего случая.

df.applymap(foo_bar)

#     A       B       C
#0  wow     bar wow bar
#1  bar wow wow     bar

Другой вариант - векторизовать вашу функцию, а затем использовать applyметод:

import numpy as np
df.apply(np.vectorize(foo_bar))
#     A       B       C
#0  wow     bar wow bar
#1  bar wow wow     bar
Псидом
источник
Привет, извините, вопрос был о применении функции, а не о том, чтобы выяснить, какая ячейка четная. позвольте мне посмотреть, смогу ли я изменить пример, чтобы сделать его более понятным ..
eljusticiero67
1
Если вы ищете применение функции, вы можете сделать этоimport numpy as np; df.apply(np.vectorize(iseven))
Псидом
2
@ eljusticiero67 Вы можете использовать, df.applymap(iseven)но обратите внимание, что для больших DataFrames он станет очень медленным, поэтому всякий раз, когда у вас есть возможность, используйте векторизованные методы.
ayhan
@ayhan - похоже, ваш метод работает, как с np.vectorize, так и без него. Не могли бы вы опубликовать ответ, чтобы я мог отдать вам должное?
eljusticiero67,
1
На самом деле я сначала не публиковал его, потому что пытался найти дубликат, чтобы связать его. Я не смог найти точный дубликат, но, может быть, этот ? Никил Мавели прав, хотя смысл можно уточнить, но, по крайней мере, я думаю, что пример должен быть таким же. Может быть, Psidom сможет отредактировать, чтобы включить собственное предложение вместе с картой применения?
ayhan