Pandas DataFrame高效行筛选问询:双整数列组合取浮点列最小值
嗨,这个需求用pandas的内置方法就能高效解决,完全不用手动遍历组合(手动遍历在数据量大的时候效率极低)。我给你两种实用的高效方案,你可以根据自己的场景选择:
方案1:
groupby() + idxmin() (推荐,直接定位最小值行) 这个方法是最直接的:先按两个整数列(比如你的titi和tutu)分组,然后找到每组中目标浮点列(tete)最小值对应的行索引,最后用这些索引提取原数据即可。
示例代码:
import pandas as pd # 假设你的数据集是df df = pd.DataFrame({ 'toto': [0, 1, 2], 'tata': ['a', 'b', 'c'], 'titi': [18, 18, 18], 'tutu': [600, 600, 600], 'tete': [4.5, 10.1, 1.2] }) # 按组合列分组,获取tete最小值的行索引 min_row_indices = df.groupby(['titi', 'tutu'])['tete'].idxmin() # 根据索引筛选出目标行,重置索引让结果更整洁 result_df = df.loc[min_row_indices].reset_index(drop=True) print(result_df)
输出结果会是tete值为1.2的那一行,完美符合你的需求。这个方法的优势是效率极高,idxmin()直接定位到最小值的位置,避免了不必要的数据复制,适合中等甚至大规模数据集。
方案2:
sort_values() + drop_duplicates() (直观易理解) 如果你更习惯先排序再去重的逻辑,这个方法也很实用:先按组合列排序,再按目标浮点列升序排列,最后保留每组的第一行(也就是最小值所在的行)。
示例代码:
# 先按组合列排序,再按tete升序排序 sorted_df = df.sort_values(by=['titi', 'tutu', 'tete'], ascending=[True, True, True]) # 保留每组的第一行,即tete最小的行 result_df = sorted_df.drop_duplicates(subset=['titi', 'tutu'], keep='first').reset_index(drop=True) print(result_df)
这个方法的好处是逻辑直观,如果你之后需要保持数据的排序状态,这个方案会更顺手。
小提醒
- 如果同一组合下
tete有多个相同的最小值,两种方法默认都会保留第一个出现的那一行;若需调整保留规则,可以修改对应参数(比如drop_duplicates的keep参数)。 - 确保组合列(
titi和tutu)的数据类型正确,不过即使是其他类型,这两个方法也能正常工作,只是你的需求里明确是整数列~
内容的提问来源于stack exchange,提问作者Stéphane
相关产品推荐
相关产品推荐

