df.groupby('A')['B].transform('mean)

43 阅读2分钟

直接使用groupbytransform来计算每个类别的平均值并添加到原始数据框中,而不需要使用merge。这样写会更简洁。具体来说,代码如下:

import pandas as pd

# 示例数据
data = {
    'category': ['A', 'A', 'B', 'B', 'C', 'C', 'C'],
    'l7d_ctr': [0.1, 0.2, 0.15, 0.25, 0.05, 0.1, 0.15]
}

df = pd.DataFrame(data)

# 使用groupby和transform计算每个类别的平均值并添加为新列
df['avg_ctr'] = df.groupby('category')['l7d_ctr'].transform('mean')

print(df)

执行上述代码后,df将包含一个新的列avg_ctr,其值为每个类别的平均l7d_ctr。以下是执行后的数据框的样子:

  category  l7d_ctr  avg_ctr
0        A     0.10     0.15
1        A     0.20     0.15
2        B     0.15     0.20
3        B     0.25     0.20
4        C     0.05     0.10
5        C     0.10     0.10
6        C     0.15     0.10

这样,每个category对应的所有行都会有一个新的列avg_ctr,其值为该类别的平均点击率(l7d_ctr)。

如果需要仅对l7d_ctr大于0的行求平均值,并将求得的平均值添加为新列,可以在transform中使用自定义函数来完成。具体的步骤如下:

  1. 过滤掉l7d_ctr小于等于0的行。
  2. 计算每个category的平均值,只对l7d_ctr大于0的行进行计算。
  3. 将计算出的平均值添加回原始数据框中。

以下是具体的实现代码:

import pandas as pd
import numpy as np

# 示例数据
data = {
    'category': ['A', 'A', 'B', 'B', 'C', 'C', 'C'],
    'l7d_ctr': [0.1, 0.2, 0.15, 0.25, 0.0, -0.1, 0.15]
}

df = pd.DataFrame(data)

# 定义一个自定义函数,计算l7d_ctr > 0的平均值
def mean_positive_ctr(group):
    return group[group > 0].mean()

# 使用transform和自定义函数
df['avg_ctr'] = df.groupby('category')['l7d_ctr'].transform(mean_positive_ctr)

print(df)

执行上述代码后,df将包含一个新的列avg_ctr,其值为每个类别的平均点击率(l7d_ctr),但仅包括l7d_ctr大于0的行。以下是执行后的数据框的样子:

  category  l7d_ctr  avg_ctr
0        A     0.10     0.15
1        A     0.20     0.15
2        B     0.15     0.20
3        B     0.25     0.20
4        C     0.00     0.15
5        C    -0.10     0.15
6        C     0.15     0.15

这样,每个category对应的所有行都会有一个新的列avg_ctr,其值为该类别中l7d_ctr大于0的行的平均值。