你能告诉我什么时候使用这些矢量化方法和基本的例子吗?
我看到map是一个系列方法,而其余的是DataFrame方法。我对apply和applymap方法感到困惑。为什么我们有两个方法来应用一个函数到一个数据帧?再一次,简单的例子说明用法将是伟大的!
你能告诉我什么时候使用这些矢量化方法和基本的例子吗?
我看到map是一个系列方法,而其余的是DataFrame方法。我对apply和applymap方法感到困惑。为什么我们有两个方法来应用一个函数到一个数据帧?再一次,简单的例子说明用法将是伟大的!
当前回答
@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
其他回答
apply和applymap之间的区别可能是最简单的解释:
Apply将整个列作为参数,然后将结果分配给该列
Applymap将单独的单元格值作为参数,并将结果分配回该单元格。
注意:如果apply返回单个值,你将得到这个值而不是赋值后的列,最终将只有一行而不是矩阵。
基于cs95的答案
map在Series ONLY上定义 applymap只在DataFrames上定义 apply定义在BOTH上
举几个例子
In [3]: frame = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])
In [4]: frame
Out[4]:
b d e
Utah 0.129885 -0.475957 -0.207679
Ohio -2.978331 -1.015918 0.784675
Texas -0.256689 -0.226366 2.262588
Oregon 2.605526 1.139105 -0.927518
In [5]: myformat=lambda x: f'{x:.2f}'
In [6]: frame.d.map(myformat)
Out[6]:
Utah -0.48
Ohio -1.02
Texas -0.23
Oregon 1.14
Name: d, dtype: object
In [7]: frame.d.apply(myformat)
Out[7]:
Utah -0.48
Ohio -1.02
Texas -0.23
Oregon 1.14
Name: d, dtype: object
In [8]: frame.applymap(myformat)
Out[8]:
b d e
Utah 0.13 -0.48 -0.21
Ohio -2.98 -1.02 0.78
Texas -0.26 -0.23 2.26
Oregon 2.61 1.14 -0.93
In [9]: frame.apply(lambda x: x.apply(myformat))
Out[9]:
b d e
Utah 0.13 -0.48 -0.21
Ohio -2.98 -1.02 0.78
Texas -0.26 -0.23 2.26
Oregon 2.61 1.14 -0.93
In [10]: myfunc=lambda x: x**2
In [11]: frame.applymap(myfunc)
Out[11]:
b d e
Utah 0.016870 0.226535 0.043131
Ohio 8.870453 1.032089 0.615714
Texas 0.065889 0.051242 5.119305
Oregon 6.788766 1.297560 0.860289
In [12]: frame.apply(myfunc)
Out[12]:
b d e
Utah 0.016870 0.226535 0.043131
Ohio 8.870453 1.032089 0.615714
Texas 0.065889 0.051242 5.119305
Oregon 6.788766 1.297560 0.860289
原因:
下面的示例显示apply和applymap应用到一个DataFrame。
map函数只能应用在Series上。不能在DataFrame上应用map。
需要记住的是,apply可以做任何applymap可以做的事情,但apply有额外的选项。
X因子选项是:axis和result_type,其中result_type仅在axis=1时有效(对于列)。
df = DataFrame(1, columns=list('abc'),
index=list('1234'))
print(df)
f = lambda x: np.log(x)
print(df.applymap(f)) # apply to the whole dataframe
print(np.log(df)) # applied to the whole dataframe
print(df.applymap(np.sum)) # reducing can be applied for rows only
# apply can take different options (vs. applymap cannot)
print(df.apply(f)) # same as applymap
print(df.apply(sum, axis=1)) # reducing example
print(df.apply(np.log, axis=1)) # cannot reduce
print(df.apply(lambda x: [1, 2, 3], axis=1, result_type='expand')) # expand result
作为旁注,不应将Series映射函数与Python映射函数混淆。
第一个应用在Series上,用于映射值,第二个应用到可迭代对象的每个项。
最后,不要混淆dataframe apply方法和groupby apply方法。
我只是想指出一点,我在这方面有过一些挣扎
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()
我的理解:
从功能上看:
如果函数具有需要在列/行内进行比较的变量,请使用 适用。
例如: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)