如何高效合并Airbnb的Listings与Reviews Pandas DataFrame?
高效合并Airbnb listings与reviews数据集的方法
你用嵌套iterrows()循环的方式效率极低,核心原因是:iterrows()本身就是逐行迭代的慢操作,嵌套循环的时间复杂度是O(n*m),当两个数据集各有10万行时,相当于要执行10^10次判断,完全是算力浪费。
下面是两种Pandas原生的高效实现方式,时间复杂度都是O(n+m),能轻松处理10万级别的数据:
方法一:分组聚合后合并
先对reviews数据集按房源ID分组,把对应评论聚合成列表,再和listings数据集做左连接:
# 1. 按listing_id分组,将对应reviews聚合成列表 reviews_grouped = reviews_df.groupby('listing_id')['reviews'].agg(list).reset_index() # 2. 左连接listings_df,保留所有房源数据 listings_with_reviews = listings_df.merge( reviews_grouped, left_on='id', right_on='listing_id', how='left' ) # 3. 无评论的房源填充空列表(可选) listings_with_reviews['reviews'] = listings_with_reviews['reviews'].apply( lambda x: x if isinstance(x, list) else [] ) # 4. 清理多余的listing_id列(可选) listings_with_reviews.drop('listing_id', axis=1, inplace=True)
方法二:字典映射快速匹配
先构建房源ID到评论列表的字典,再用map()直接匹配到listings数据集中:
# 1. 生成listing_id对应reviews列表的字典 review_map = reviews_df.groupby('listing_id')['reviews'].agg(list).to_dict() # 2. 给listings_df添加reviews列,无评论的填充空列表 listings_df['reviews'] = listings_df['id'].map(review_map).fillna([]).tolist()
注意点
你原代码里有个小笔误:reviews_df的示例列名是reviews,但循环里写的是r_row['comments'],实际使用时要保证列名一致,否则会报错。
内容的提问来源于stack exchange,提问作者Aamir Shaikh
相关产品推荐
相关产品推荐

