Разница между map, applymap и apply методы в панд
можете ли вы сказать мне, когда использовать эти методы векторизации с основными примерами?
Я вижу map Это Series метод, в то время как остальные DataFrame методы. Я запутался насчет apply и методы. Почему у нас есть два метода для применения функции к фрейму данных? Опять же, простые примеры, которые иллюстрируют использование было бы здорово!
8 ответов:
прямо от Уэса Маккинни Python для анализа данных книги, ПГ. 132 (я настоятельно рекомендовал эту книгу):
другой частой операцией является применение функции на 1D массивах к каждому столбцу или строке. Метод DataFrame apply делает именно это:
In [116]: frame = DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon']) In [117]: frame Out[117]: b d e Utah -0.029638 1.081563 1.280300 Ohio 0.647747 0.831136 -1.549481 Texas 0.513416 -0.884417 0.195343 Oregon -0.485454 -0.477388 -0.309548 In [118]: f = lambda x: x.max() - x.min() In [119]: frame.apply(f) Out[119]: b 1.133201 d 1.965980 e 2.829781 dtype: float64многие из наиболее распространенных статистических массивов (например, sum и mean) являются методами DataFrame, таким образом, используя прикладывать не надо.
элемент-мудрый Также можно использовать функции Python. Предположим, вы хотите вычислить форматированную строку из каждого значения с плавающей запятой в кадре. Вы можете сделать это с помощью applymap:
In [120]: format = lambda x: '%.2f' % x In [121]: frame.applymap(format) Out[121]: b d e Utah -0.03 1.08 1.28 Ohio 0.65 0.83 -1.55 Texas 0.51 -0.88 0.20 Oregon -0.49 -0.48 -0.31причина для имени applymap заключается в том, что серия имеет метод map для применения поэлементной функции:
In [122]: frame['e'].map(format) Out[122]: Utah 1.28 Ohio -1.55 Texas 0.20 Oregon -0.31 Name: e, dtype: objectподводя итоги
applyработает на основе строки / столбца фрейма данных,applymapработает элементарно на фрейме данных, иmapработает элементарно на a Серии.
в этих ответах есть отличная информация, но я добавляю свой собственный, чтобы четко суммировать, какие методы работают в массиве по сравнению с элементами. jeremiahbuddha в основном делал это, но не упоминал серии.применять. У меня нет репутации, чтобы комментировать.
DataFrame.applyработает на целых строках или столбцах одновременно.
DataFrame.applymap,Series.applyиSeries.mapработы на одном стихия на время.существует много перекрытий между возможностями
Series.applyиSeries.map, что означает, что любой из них будет работать в большинстве случаев. Однако у них есть некоторые небольшие различия, некоторые из которых были обсуждены в ответе osa.
добавление к другим ответам, в
Seriesтакже карта и применить.применить может сделать фрейм данных из серии; однако map просто поместит серию в каждую ячейку другой серии, что, вероятно, не то, что вы хотите.
In [40]: p=pd.Series([1,2,3]) In [41]: p Out[31]: 0 1 1 2 2 3 dtype: int64 In [42]: p.apply(lambda x: pd.Series([x, x])) Out[42]: 0 1 0 1 1 1 2 2 2 3 3 In [43]: p.map(lambda x: pd.Series([x, x])) Out[43]: 0 0 1 1 1 dtype: int64 1 0 2 1 2 dtype: int64 2 0 3 1 3 dtype: int64 dtype: objectкроме того, если бы у меня была функция с побочными эффектами, такими как" подключение к веб-серверу", я бы, вероятно, использовал
applyпросто ради ясность.series.apply(download_file_for_every_element)
Mapможно использовать не только функцию, но и словарь или другую серию. допустим, вы хотите манипулировать перестановок.забрать
1 2 3 4 5 2 1 4 5 3квадрат этой перестановки
1 2 3 4 5 1 2 5 3 4вы можете вычислить его с помощью
map. Не уверен, что само приложение документировано, но оно работает в0.15.1.In [39]: p=pd.Series([1,0,3,4,2]) In [40]: p.map(p) Out[40]: 0 0 1 1 2 4 3 2 4 3 dtype: int64
@jeremiahbuddha упомянул, что apply работает над строкой / столбцами, в то время как applymap работает по элементам. Но, похоже, вы все еще можете использовать apply для поэлементных вычислений....
frame.apply(np.sqrt) Out[102]: b d e Utah NaN 1.435159 NaN Ohio 1.098164 0.510594 0.729748 Texas NaN 0.456436 0.697337 Oregon 0.359079 NaN NaN frame.applymap(np.sqrt) Out[103]: b d e Utah NaN 1.435159 NaN Ohio 1.098164 0.510594 0.729748 Texas NaN 0.456436 0.697337 Oregon 0.359079 NaN NaN
просто хотел указать, как я боролся с этим немного
def f(x): if x < 0: x = 0 elif x > 100000: x = 100000 return x df.applymap(f) df.describe()это не изменяет сам фрейм данных, должен быть переназначен
df = df.applymap(f) df.describe()
вероятно, самое простое объяснение разница между apply и applymap:
применить принимает весь столбец в качестве параметра, а затем присваивает результат этому столбцу
applymap принимает значение отдельной ячейки в качестве параметра и присваивает результат этой ячейке.
NB если применить возвращает единственное значение, вы будете иметь это значение вместо столбца после назначения и в конечном итоге будет иметь только строку вместо матрица.
в моем понимании:
С точки зрения функции:
если функция имеет переменные, которые необходимо сравнить в столбце/ строке, используйте
apply.например:
lambda x: x.max()-x.mean().если функция должна быть применена к каждому элементу:
1 > Если столбец/строка находится, используйте
apply2 > если применить ко всему фрейму данных, используйте
applymapmajority = lambda x : x > 17 df2['legal_drinker'] = df2['age'].apply(majority) def times10(x): if type(x) is int: x *= 10 return x df2.applymap(times10)
Comments