如何使用top100 DataFrame筛选百万行的pandas database DataFrame?
嘿,这个需求我经常碰到,用pandas有好几种靠谱的实现方式,我给你拆解一下最实用的几个:
方法1:用
merge()做内连接(最直观简洁) 这是处理多列组合匹配的首选方案,直接通过内连接就能精准筛选出两个DataFrame中city+state完全匹配的行:
import pandas as pd # 内连接,只保留两边都存在的城市-州组合,同时保留database的data列 filtered_database = pd.merge(database, top100, on=['city', 'state'], how='inner')
这里on=['city', 'state']指定用这两列作为匹配的键,how='inner'确保只有同时出现在top100和database里的组合才会被保留,结果会包含database的所有列(包括data),完全符合你的需求。
方法2:用MultiIndex配合
isin()(大数据量更高效) 如果你的database有100万行,这种基于索引的操作会比循环/apply快很多:
# 把top100的城市-州组合转换成MultiIndex top100_pairs = pd.MultiIndex.from_frame(top100) # 给database设置临时的MultiIndex,然后筛选匹配的行,最后恢复原索引 filtered_database = database[database.set_index(['city', 'state']).index.isin(top100_pairs)] filtered_database = filtered_database.reset_index(drop=True)
这种方法避免了逐行遍历,利用pandas的底层优化来提升效率,非常适合处理大规模数据。
方法3:用
isin()配合元组集合(灵活但适合小数据) 如果想手动控制匹配逻辑,可以把top100的组合打包成元组集合,再逐行判断:
# 生成top100的城市-州元组集合 valid_pairs = set(zip(top100['city'], top100['state'])) # 筛选database中符合条件的行 filtered_database = database[database.apply(lambda row: (row['city'], row['state']) in valid_pairs, axis=1)]
不过要注意,apply是逐行操作,100万行的话速度会慢一些,所以更适合数据量不大的场景。
小提醒
别单独对city和state分别用isin()哦!比如可能存在“Richmond”同时在Virginia和其他州的情况,单独匹配会把不属于top100的组合也筛进来,一定要用组合匹配才行。
内容的提问来源于stack exchange,提问作者Thanh Nguyen
相关产品推荐
相关产品推荐

