将函数应用于pandas中的DataFrame中的每个单元格

Fra*_*urt 6 python dataframe pandas

是否可以将函数应用于pandas 的DataFrame 中的每个单元格?

我知道pandas.DataFrame.applymap但它似乎不允许就地应用程序:

import numpy as np
import pandas as pd
np.random.seed(1)
frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), 
                     index=['Utah', 'Ohio', 'Texas', 'Oregon'])
print(frame)
format = lambda x: '%.2f' % x
frame = frame.applymap(format)
print(frame)
Run Code Online (Sandbox Code Playgroud)

收益:

               b         d         e
Utah    1.624345 -0.611756 -0.528172
Ohio   -1.072969  0.865408 -2.301539
Texas   1.744812 -0.761207  0.319039
Oregon -0.249370  1.462108 -2.060141

            b      d      e
Utah     1.62  -0.61  -0.53
Ohio    -1.07   0.87  -2.30
Texas    1.74  -0.76   0.32
Oregon  -0.25   1.46  -2.06
Run Code Online (Sandbox Code Playgroud)

frame = frame.applymap(format)将暂时保存2份frame内存,这是我不想要的.

我知道可以使用NumPy数组将函数应用于每个单元格:将NumPy数组映射到位.

Alt*_*ter 2

如果这对你很重要,你可以尝试制作自己的 cpython 函数

在 pandas 中找到了 applymap 函数

def applymap(self, func):
      # ...
      def infer(x):
            if x.empty:
                return lib.map_infer(x, func)
            return lib.map_infer(x.asobject, func)

      return self.apply(infer)
Run Code Online (Sandbox Code Playgroud)

这表明lib.map_infer正在幕后进行工作

lib.map_infer是这里定义的 cython 方法,您可以清楚地看到它们为新结果分配空间:result = np.empty(n, dtype=object),如下所示

def map_infer(ndarray arr, object f, bint convert=1):
    """
    Substitute for np.vectorize with pandas-friendly dtype inference
    Parameters
    ----------
    arr : ndarray
    f : function
    Returns
    -------
    mapped : ndarray
    """
    cdef:
        Py_ssize_t i, n
        ndarray[object] result
        object val

    n = len(arr)
    result = np.empty(n, dtype=object)
    for i in range(n):
        val = f(util.get_value_at(arr, i))

        # unbox 0-dim arrays, GH #690
        if is_array(val) and PyArray_NDIM(val) == 0:
            # is there a faster way to unbox?
            val = val.item()

        result[i] = val

    if convert:
        return maybe_convert_objects(result,
                                     try_float=0,
                                     convert_datetime=0,
                                     convert_timedelta=0)

return result
Run Code Online (Sandbox Code Playgroud)

...这就是我的答案的悬崖机库。也许操作员或某人可以修改 cython 方法来创建一个修改原始数组的就地版本,而不是创建新结果

-我目前远离我的编码计算机,所以我无法测试任何东西:(