You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用DataFrame.loc[]获取单行数据,非单行时抛出异常

Pandas实现类似SQLAlchemy Query.one()的单行数据获取方法

假设我们有如下DataFrame:

import pandas as pd
df = pd.DataFrame([["house", "red"], ["car", "blue"]], columns=["item", "colour"])

需求:使用DataFrame.loc筛选数据时,获取单行数据并以pd.Series返回;若筛选结果不是恰好一行(0行或多行),则抛出异常,实现类似SQLAlchemy中Query.one()的功能。

现有代码片段:

match = df.loc[df["colour"] == "red"]
# 已知结果DataFrame恰好有一行
# TODO:如何让match返回单行pd.Series

解决方案

基础实现方式

先执行筛选,手动校验行数后转换为Series:

mask = df["colour"] == "red"
match_df = df.loc[mask]

# 校验行数,非1行则抛异常
if len(match_df) != 1:
    raise ValueError(f"预期恰好1行数据,实际获取到{len(match_df)}行")

# 将单行DataFrame转为Series
match_series = match_df.iloc[0]

封装复用函数(惯用方式)

将逻辑封装成可复用函数,方便多次调用:

def get_one_row(df, filter_mask):
    result_df = df.loc[filter_mask]
    row_count = len(result_df)
    if row_count != 1:
        raise ValueError(f"预期1行数据,实际找到{row_count}行")
    return result_df.iloc[0]

# 使用示例
match_series = get_one_row(df, df["colour"] == "red")

关键说明

  • 用len(result_df)检查筛选结果的行数,确保符合"恰好一行"的要求,不符合时抛出明确的异常信息
  • 通过iloc[0]将单行DataFrame转换为pd.Series,这是Pandas中提取单行并转为Series的标准操作

内容的提问来源于stack exchange,提问作者Mikko Ohtamaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:03:18