如何基于阈值列表筛选DataFrame?求Python/R实现代码
Python 实现
核心思路是先将两个DataFrame按target字段合并,把对应阈值匹配到每条数据上,再进行筛选,无需写大量条件判断。
import pandas as pd # 替换为你的实际数据加载方式(比如pd.read_csv) df_a = pd.DataFrame({ 'target': ['SDOIII', 'SDOII', 'SoxH', 'SDOIII', 'LbpA1', 'SoxH', 'SoxH'], 'query.': ['a', 'a', 'a', 'b', 'b', 'b', 'a'], 'score': [92.8, 72.8, 66, 67, 18, 12, 7] }) df_b = pd.DataFrame({ 'target': ['SDOIII', 'SDOII', 'SoxH', 'LbpA1'], 'threshold': [4, 5, 6, 7] }) # 左连接合并,保留A的所有行并匹配B的阈值 merged_df = pd.merge(df_a, df_b, on='target', how='left') # 筛选score大于等于对应阈值的行 filtered_df = merged_df[merged_df['score'] >= merged_df['threshold']] # 可选:移除阈值列(如果不需要保留) filtered_df = filtered_df.drop('threshold', axis=1) print(filtered_df)
R 实现
使用dplyr包的连接和筛选函数,同样通过合并避免大量条件:
library(dplyr) # 替换为你的实际数据加载方式(比如read.csv) df_a <- data.frame( target = c("SDOIII", "SDOII", "SoxH", "SDOIII", "LbpA1", "SoxH", "SoxH"), query. = c("a", "a", "a", "b", "b", "b", "a"), score = c(92.8, 72.8, 66, 67, 18, 12, 7) ) df_b <- data.frame( target = c("SDOIII", "SDOII", "SoxH", "LbpA1"), threshold = c(4, 5, 6, 7) ) # 合并数据并筛选 filtered_df <- df_a %>% left_join(df_b, by = "target") %>% filter(score >= threshold) %>% select(-threshold) # 可选:移除阈值列 print(filtered_df)
说明
- 合并操作会自动将每个
target对应的阈值匹配到DataFrame A的每一行,无论有多少个target都能轻松处理。 - 如果DataFrame A中存在DataFrame B没有的
target,合并后阈值会是NA,这类行会被筛选自动排除(因为NA参与比较返回FALSE)。若需特殊处理这类情况,可以在筛选前添加逻辑判断。
内容的提问来源于stack exchange,提问作者Arijit
相关产品推荐
相关产品推荐

