Pandas Apply vs Transform,当使用Groupby和np时,

von4xj4u  于 2023-09-29  发布在  其他
关注(0)|答案(1)|浏览(129)

我在我的dataframe中创建了一系列计算,并成功地使用了apply,直到下面的一个例子。有谁能解释一下为什么“transform”在这个例子中起作用,而“apply”不起作用?我已经成功地用apply做了加法和减法运算,所以新的方面是np. where。
它不会抛出错误,只是为列返回NaN。
我能找到的所有适用地址的文章都不应该有这种类型的限制。有很多信息表明transform应该更有限制,即一次只处理一列,并被迫返回等于序列长度的值。

df['val'] = compiled.groupby(['category']).B.apply(lambda x : np.where(x > 0, x, 0))

df['val'] = compiled.groupby(['category']).B.transform(lambda x : np.where(x > 0, x, 0))
8ulbf1ek

8ulbf1ek1#

df.groupby('category').V.apply(f),当f返回一个numpy数组时,将返回一个 Dataframe ,每个类别一个项目:

import numpy as np
import pandas as pd
np.random.seed(1701)
df = pd.DataFrame({
    'category': ['A', 'A', 'A', 'B', 'B', 'B'],
    'B': np.random.randn(6)
})
df.groupby('category').B.apply(lambda x : np.where(x > 0, x, 0))
# category
# A    [0.0, 2.3759516516254156, 0.0]
# B                   [0.0, 0.0, 0.0]
# Name: B, dtype: object

df.groupby('category').V.transform(f),当f返回一个numpy数组时,将返回一个dataframe,其中原始dataframe中每行有一个项目:

df.groupby('category').B.transform(lambda x : np.where(x > 0, x, 0))
# 0    0.000000
# 1    2.375952
# 2    0.000000
# 3    0.000000
# 4    0.000000
# 5    0.000000
# Name: B, dtype: float64

由于您要将结果分配给原始 Dataframe 中的列,因此transform是要使用的适当方法。
请注意,如果f返回一个pandas Series,则apply的行为与transform类似,这可能是apply在过去为您工作的原因。
有关applytransform之间差异的更深入讨论,请参见this answer

相关问题