Pandas匹配两个DataFrame的姓名年份,合并score值到summary列
问题原因
- 原有代码仅处理了
m_count == 1的行,m_count = 2的行直接跳过,所以对应summary保留了初始值0 - 就算去掉m_count的判断逻辑,原有赋值逻辑是直接覆盖旧值,遇到多个匹配的score值时只会保留最后一个,无法实现多值拼接
- 嵌套遍历DataFrame的写法效率极低,数据量稍大就会严重影响运行速度
解决方案
用Pandas内置的分组聚合+左合并实现需求,代码如下:
import pandas as pd lst = [['juli', 25,2010], ['krish', 30,2020], ['nick', 26, 2021], ['juli', 22,2020],['juli', 54,2010]] df = pd.DataFrame(lst, columns =['Name', 'score',"year"]) lst1 = [['juli', 2,2010], ['krish', 1,2020], ['nick', 1, 2021], ['juli', 1,2020] ] df1 = pd.DataFrame(lst1, columns =['Name', 'm_count',"year"]) # 按Name和year分组,将score拼接为逗号分隔的字符串 df_score_agg = df.groupby(['Name', 'year'], as_index=False)['score'].agg( lambda x: ','.join(x.astype(str)) ) # 合并到df1中生成summary字段 df1 = df1.merge(df_score_agg, on=['Name', 'year'], how='left').rename(columns={'score': 'summary'}) print(df1)
运行结果
Name m_count year summary 0 juli 2 2010 25,54 1 krish 1 2020 30 2 nick 1 2021 26 3 juli 1 2020 22
内容的提问来源于stack exchange,提问作者MQ_Python
相关产品推荐
相关产品推荐

