直接使用groupby和transform来计算每个类别的平均值并添加到原始数据框中,而不需要使用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中使用自定义函数来完成。具体的步骤如下:
- 过滤掉
l7d_ctr小于等于0的行。 - 计算每个
category的平均值,只对l7d_ctr大于0的行进行计算。 - 将计算出的平均值添加回原始数据框中。
以下是具体的实现代码:
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的行的平均值。