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数组映射到位.
如果这对你很重要,你可以尝试制作自己的 cpython 函数
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 方法来创建一个修改原始数组的就地版本,而不是创建新结果
-我目前远离我的编码计算机,所以我无法测试任何东西:(