Pandas:基于另一DataFrame子串匹配计算列均值
解决方法:计算每个颜色的平均得分并合并到DataFrame
嘿,这问题我之前也碰到过,别慌,咱们一步步来搞定它!核心思路就是先把color_scores里的多颜色字符串拆成单独的颜色行,再计算每个颜色的平均分,最后把结果关联到color_avgs里。
方法一:分步拆解(清晰易懂)
拆分多颜色字符串并展开成行
先把color_scores中每个单元格的颜色列表拆分成单独的条目,让每个颜色对应原来的分数:import pandas as pd color_scores = pd.DataFrame({'score': [12.4, 9.8, 7.4, 2.6, 14.8], 'colors': ['blue, red, green', 'blue, purple, orange', 'blue, pink, yellow', 'purple, pink, orange', 'yellow, pink, green']}) color_avgs = pd.DataFrame({'colors': [ 'blue', 'red', 'green', 'purple', 'orange', 'pink', 'yellow', ]}) # 拆分颜色字符串为列表,再展开成多行 color_scores_exploded = color_scores.assign(colors=color_scores['colors'].str.split(', ')).explode('colors')这一步之后,
color_scores_exploded会变成每行对应一个颜色和它的分数,比如:score colors 12.4 blue 12.4 red 12.4 green ... ... 计算每个颜色的平均分
按颜色分组,对score列求平均值:color_avg_scores = color_scores_exploded.groupby('colors')['score'].mean().reset_index(name='avg_score')这里得到的
color_avg_scores就是每个颜色对应的平均分数据框。合并到color_avgs
用merge把平均分关联到color_avgs中:color_avgs = color_avgs.merge(color_avg_scores, on='colors', how='left')
方法二:链式写法(简洁高效)
如果不想写太多中间变量,可以把步骤合并成一行,用map直接赋值:
color_avgs['avg_score'] = color_avgs['colors'].map( color_scores.assign(colors=color_scores['colors'].str.split(', ')) .explode('colors') .groupby('colors')['score'] .mean() )
最终结果
运行完上面的代码后,color_avgs会变成这样:
| colors | avg_score |
|---|---|
| blue | 9.866667 |
| red | 12.400000 |
| green | 13.600000 |
| purple | 6.200000 |
| orange | 6.200000 |
| pink | 8.266667 |
| yellow | 11.100000 |
这样就完美实现你想要的效果啦!
内容的提问来源于stack exchange,提问作者jalexbin
相关产品推荐
相关产品推荐

