Разница между map, applymap и apply методы в панд



можете ли вы сказать мне, когда использовать эти методы векторизации с основными примерами?



Я вижу map Это Series метод, в то время как остальные DataFrame методы. Я запутался насчет apply и методы. Почему у нас есть два метода для применения функции к фрейму данных? Опять же, простые примеры, которые иллюстрируют использование было бы здорово!

1479   8  

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 > Если столбец/строка находится, используйте apply

2 > если применить ко всему фрейму данных, используйте applymap

majority = 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

    Ничего не найдено.