你能告诉我什么时候使用这些矢量化方法和基本的例子吗?
我看到map是一个系列方法,而其余的是DataFrame方法。我对apply和applymap方法感到困惑。为什么我们有两个方法来应用一个函数到一个数据帧?再一次,简单的例子说明用法将是伟大的!
你能告诉我什么时候使用这些矢量化方法和基本的例子吗?
我看到map是一个系列方法,而其余的是DataFrame方法。我对apply和applymap方法感到困惑。为什么我们有两个方法来应用一个函数到一个数据帧?再一次,简单的例子说明用法将是伟大的!
当前回答
快速的总结
DataFrame。Apply一次操作整个行或列。 DataFrame。applymap系列。apply和Series。Map操作1 元素。
系列。应用和系列。地图是相似的,经常可以互换。下面osa的回答中讨论了他们之间的一些细微差异。
其他回答
原因:
下面的示例显示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方法。
apply和applymap之间的区别可能是最简单的解释:
Apply将整个列作为参数,然后将结果分配给该列
Applymap将单独的单元格值作为参数,并将结果分配回该单元格。
注意:如果apply返回单个值,你将得到这个值而不是赋值后的列,最终将只有一行而不是矩阵。
为了增加上下文和直观感受,这里有一个明确而具体的例子来说明它们的区别。
假设您有如下所示的函数。( 这个标签函数,将根据你提供的参数(x)的阈值,将值任意地分为'High'和'Low'。
def label(element, x):
if element > x:
return 'High'
else:
return 'Low'
在这个例子中,假设我们的数据框架有一列是随机数。
如果你尝试用map映射label函数:
df['ColumnName'].map(label, x = 0.8)
您将得到以下错误:
TypeError: map() got an unexpected keyword argument 'x'
现在使用相同的函数并使用apply,你会看到它是有效的:
df['ColumnName'].apply(label, x=0.8)
Series.apply()可以按元素接受额外的参数,而Series.map()方法将返回一个错误。
现在,如果您试图同时将相同的函数应用到数据帧中的多个列,则使用dataframe .applymap()。
df[['ColumnName','ColumnName2','ColumnName3','ColumnName4']].applymap(label)
最后,您还可以在dataframe上使用apply()方法,但dataframe .apply()方法具有不同的功能。df.apply()方法不是按元素应用函数,而是沿轴(按列或行)应用函数。在创建用于df.apply()的函数时,我们将其设置为接受一个序列,最常见的是一个列。
这里有一个例子:
df.apply(pd.value_counts)
当我们应用pd。函数,它计算了所有列的值计数。
注意,当我们使用df.apply()方法转换多个列时,这一点非常重要。这是可能的,因为pd。Value_counts函数作用于一个序列。如果我们尝试使用df.apply()方法将一个按元素工作的函数应用到多个列,则会得到一个错误:
例如:
def label(element):
if element > 1:
return 'High'
else:
return 'Low'
df[['ColumnName','ColumnName2','ColumnName3','ColumnName4']].apply(label)
这将导致以下错误:
ValueError: ('The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().', u'occurred at index Economy')
一般来说,只有当向量化函数不存在时,才应该使用apply()方法。回忆一下pandas使用向量化,即一次将操作应用到整个系列的过程,以优化性能。当我们使用apply()方法时,我们实际上是在遍历行,因此向量化方法可以比apply()方法更快地执行等效任务。
下面是一些已经存在的向量化函数的例子,你不想使用任何类型的apply/map方法重新创建它们:
Series.str.split() Splits each element in the Series Series.str.strip() Strips whitespace from each string in the Series. Series.str.lower() Converts strings in the Series to lowercase. Series.str.upper() Converts strings in the Series to uppercase. Series.str.get() Retrieves the ith element of each element in the Series. Series.str.replace() Replaces a regex or string in the Series with another string Series.str.cat() Concatenates strings in a Series. Series.str.extract() Extracts substrings from the Series matching a regex pattern.
@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
快速的总结
DataFrame。Apply一次操作整个行或列。 DataFrame。applymap系列。apply和Series。Map操作1 元素。
系列。应用和系列。地图是相似的,经常可以互换。下面osa的回答中讨论了他们之间的一些细微差异。