如何用Pandas匹配数据集并按频率条件过滤剔除行
Pandas高效过滤匹配Pinout频率范围的方法
直接用Pandas的合并+矢量化布尔过滤就能搞定,比for循环高效得多,尤其适合大型数据集。具体步骤如下:
1. 合并两个数据集(匹配Pinout)
先用merge把DF2里的频率上下限关联到DF1对应的Pinout行上,这样每一行都能拿到自己对应的频率范围:
# 假设DF1包含Pinout、Frequency等列;DF2包含Pinout、Min_limit、Max_limit列 merged_df = df1.merge(df2, on='Pinout', how='left')
how='left'会保留DF1所有行,若某个Pinout在DF2中不存在,对应的Min/Max会是NaN,后续可以选择过滤掉这些行。- 如果只需要保留DF2中存在的Pinout数据,换成
how='inner'即可。
2. 过滤频率在范围内的行
用布尔索引筛选出Frequency在Min_limit和Max_limit之间的行:
filtered_df = merged_df[(merged_df['Frequency'] >= merged_df['Min_limit']) & (merged_df['Frequency'] <= merged_df['Max_limit'])]
这一步是矢量化操作,比逐行循环快几个数量级,完全适配大型数据集。
3. 清理多余列(可选)
如果不需要保留Min_limit和Max_limit列,直接删掉:
filtered_df = filtered_df.drop(columns=['Min_limit', 'Max_limit'])
完整示例代码
import pandas as pd # 模拟示例数据 df1 = pd.DataFrame({ 'Pinout': ['A', 'A', 'B', 'B', 'C'], 'Channel': [1, 2, 1, 3, 2], 'Frequency': [50, 25000, 30, 15000, 10] # 其中25000和10超出范围 }) df2 = pd.DataFrame({ 'Pinout': ['A', 'B'], 'Min_limit': [20, 20], 'Max_limit': [20000, 20000] }) # 合并+过滤 merged_df = df1.merge(df2, on='Pinout', how='left') filtered_df = merged_df[(merged_df['Frequency'] >= merged_df['Min_limit']) & (merged_df['Frequency'] <= merged_df['Max_limit'])].drop(columns=['Min_limit', 'Max_limit']) print(filtered_df)
输出结果会自动剔除频率超标的行(Pinout A的25000Hz、Pinout C的10Hz)。
内容的提问来源于stack exchange,提问作者Luis Pineda
相关产品推荐
相关产品推荐

