如何基于多列字符串条件与数值计算生成新列(Pandas实现)
Pandas处理关键词DataFrame的解决方案
完整代码
import pandas as pd import re # 示例输入数据 df = pd.DataFrame( { 'keyword': ['apple store', 'apple marketing', 'apple store', 'apple marketing'], 'rank': [10, 12, 10, 12], 'impression': [100, 200, 100, 200], 'landing page': ['nol.com/123', 'nol.com/123', 'oats.com/123', 'oats.com/123'] } ) # 1. 拆分关键词为单个单词并展开行 df['keyword'] = df['keyword'].apply(lambda x: re.findall(r'\w+', x)) df_exploded = df.explode('keyword').reset_index(drop=True) # 2. 计算加权mean_rank及总impression grouped = df_exploded.groupby(['landing page', 'keyword']).agg( mean_rank=('rank', lambda x: (x * df_exploded.loc[x.index, 'impression']).sum() / df_exploded.loc[x.index, 'impression'].sum()), impression=('impression', 'sum') ).reset_index() # 3. 计算keyword_length grouped['keyword_length'] = grouped['keyword'].str.len() # 4. 计算impression_per_char,保留两位小数 grouped['impression_per_char'] = (grouped['impression'] / (grouped['keyword_length'] + 1)).round(2) # 调整列顺序匹配示例输出 result = grouped[['keyword', 'mean_rank', 'impression', 'landing page', 'keyword_length', 'impression_per_char']] print(result)
代码解释
1. 拆分并展开关键词
用re.findall(r'\w+', x)提取关键词中的每个单词,比单纯按空格分隔更适配含特殊符号的场景;通过explode将列表型的keyword列展开为多行,每个单词单独成行,矢量化操作效率高,可轻松处理1万行数据集。
2. 加权平均计算mean_rank
按落地页+单词分组,采用(rank*impression).sum()/impression.sum()计算加权平均排名,避免简单平均忽略曝光量的权重;同时聚合得到每个单词的总曝光量。
3. 计算单词长度
使用str.len()快速获取每个单词的字符长度,属于Pandas矢量化操作,性能远高于循环遍历。
4. 计算字符曝光比
按照公式impression/(keyword_length +1)计算,用round(2)保留两位小数,保证结果可读性。
输出结果
运行代码后得到的结果与示例输出一致:
keyword mean_rank impression landing page keyword_length impression_per_char 0 apple 11.0 300 nol.com/123 5 50.00 1 marketing 12.0 200 nol.com/123 9 20.00 2 store 10.0 100 nol.com/123 5 16.67 3 apple 11.0 300 oats.com/123 5 50.00 4 marketing 12.0 200 oats.com/123 9 20.00 5 store 10.0 100 oats.com/123 5 16.67
内容的提问来源于stack exchange,提问作者Mystic
相关产品推荐
相关产品推荐

