如何提取一个dataframe中列值存在于另一个dataframe的对应行
问题解决方法
原有代码错误原因
- 你定义的df1、df2初始为Python字典,需要先转换为Pandas的DataFrame对象才能按DataFrame的逻辑操作
- 直接用
for row in df1遍历DataFrame时,默认遍历的是列名而非行数据,无法获取每行的Stream字段值 - 比较逻辑不成立:
row['Stream'] == df2['Test']是将单个字符串和整个Series做对比,返回的是布尔数组,不能直接作为if判断的条件
正确实现代码
推荐使用Pandas内置的isin()向量化方法,效率更高,无需手动写循环:
import pandas as pd # 先将字典转换为DataFrame df1 = pd.DataFrame({'Stream': ['Netflix', 'Hulu', 'YouTube', 'Aprime', 'HBO', 'Peacock', 'Tubi'], 'Percent': [51, 19, 40, 18, 35, 12, 7]}) df2 = pd.DataFrame({'Test': ['Hulu', 'Netflix', 'Disney']}) # 筛选df1中Stream字段存在于df2的Test字段中的行 result = df1[df1['Stream'].isin(df2['Test'])] print(result)
运行后输出结果如下:
Stream Percent 0 Netflix 51 1 Hulu 19
如果需要和你预期的输出顺序一致(Hulu在前、Netflix在后),可以额外补充匹配df2顺序的逻辑:
result = df1[df1['Stream'].isin(df2['Test'])].set_index('Stream').reindex(df2['Test'].dropna()).dropna().reset_index()
如果你一定要用循环实现,可以修改为如下写法,但不推荐,数据量大时效率远低于向量化操作:
# 循环实现(不推荐) target_streams = df2['Test'].tolist() for _, row in df1.iterrows(): if row['Stream'] in target_streams: print(row)
内容的提问来源于stack exchange,提问作者masonlaw12
相关产品推荐
相关产品推荐

