核心模块(Modules)
模型 I/O(ModelIO)
输出解析器(OutputParsers)
类型(Types)
Pandas数据框(PandasDataFrame)

Pandas DataFrame 解析器

Pandas DataFrame 是 Python 编程语言中常用的数据结构,通常用于数据操作和分析。它提供了一套全面的工具,用于处理结构化数据,使其成为数据清洗、转换和分析等任务的多功能选择。

该输出解析器允许用户指定任意 Pandas DataFrame,并查询 LLM 来以字典格式提取相应 DataFrame 中的数据。请记住,大型语言模型是有缺陷的抽象!您将需要使用具有足够容量的 LLM 生成符合定义格式指令的查询。

使用 Pandas 的 DataFrame 对象声明要执行查询的 DataFrame。

import pprint
from typing import Any, Dict
 
import pandas as pd
from langchain.output_parsers import PandasDataFrameOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
model = ChatOpenAI(temperature=0)
# 仅用于文档目的。
def format_parser_output(parser_output: Dict[str, Any]) -> None:
    for key in parser_output.keys():
        parser_output[key] = parser_output[key].to_dict()
    return pprint.PrettyPrinter(width=4, compact=True).pprint(parser_output)
# 定义您想要的 Pandas DataFrame。
df = pd.DataFrame(
    {
        "num_legs": [2, 4, 8, 0],
        "num_wings": [2, 0, 0, 0],
        "num_specimen_seen": [10, 2, 1, 8],
    }
)
 
# 设置解析器 + 将说明注入到提示模板中。
parser = PandasDataFrameOutputParser(dataframe=df)
# 这是正在执行的列操作示例。
df_query = "检索 num_wings 列。"
 
# 设置提示。
prompt = PromptTemplate(
    template="回答用户查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
 
chain = prompt | model | parser
parser_output = chain.invoke({"query": df_query})
 
format_parser_output(parser_output)
{'num_wings': {0: 2,
               1: 0,
               2: 0,
               3: 0}}
# 这是正在执行的行操作示例。
df_query = "检索第一行。"
 
# 设置提示。
prompt = PromptTemplate(
    template="回答用户查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
 
chain = prompt | model | parser
parser_output = chain.invoke({"query": df_query})
 
format_parser_output(parser_output)
{'0': {'num_legs': 2,
       'num_specimen_seen': 10,
       'num_wings': 2}}
# 这是限制行数的随机 Pandas DataFrame 操作的示例。
df_query = "从第 1 行到第 3 行检索 num_legs 列的平均值。"
 
# 设置提示。
prompt = PromptTemplate(
    template="回答用户查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
 
chain = prompt | model | parser
parser_output = chain.invoke({"query": df_query})
 
print(parser_output)
{'mean': 4.0}
# 这是一个格式错误查询的示例
df_query = "检索 num_fingers 列的平均值。"
 
# 设置提示。
prompt = PromptTemplate(
    template="回答用户查询。\n{format_instructions}\n{query}\n",
    input_variables=["query"],
    partial_variables={"format_instructions": parser.get_format_instructions()},
)
 
chain = prompt | model | parser
parser_output = chain.invoke({"query": df_query})
    307     kwargs ["run_manager"] = run_manager
--> 308 return func(input, **kwargs)


File ~/workplace/langchain/libs/core/langchain_core/output_parsers/base.py: 171, in BaseOutputParser.invoke.<locals>.<lambda>(inner_input)
    166 def invoke(
    167     self, input: Union [str, BaseMessage], config: Optional [RunnableConfig] = None
    168 ) -> T:
    169     if isinstance(input, BaseMessage):
    170         return self._call_with_config(
--> 171             lambda inner_input: self.parse_result(
    172                 [ChatGeneration(message = inner_input)]
    173             ),
    174             input,
    175             config,
    176             run_type = "parser",
    177         )
    178     else:
    179         return self._call_with_config(
    180             lambda inner_input: self.parse_result([Generation(text = inner_input)]),
    181             input,
    182             config,
    183             run_type = "parser",
    184         )


File ~/workplace/langchain/libs/core/langchain_core/output_parsers/base.py: 222, in BaseOutputParser.parse_result(self, result, partial)
    209 def parse_result(self, result: List [Generation], *, partial: bool = False) -> T:
    210     "" " Parse a list of candidate model Generations into a specific format.
    211 
    212     The return value is parsed from only the first Generation in the result, which
   (...)
    220         Structured output.
    221     "" "
--> 222     return self.parse(result [0].text)


File ~/workplace/langchain/libs/langchain/langchain/output_parsers/pandas_dataframe.py: 90, in PandasDataFrameOutputParser.parse(self, request)
     88 request_type, request_params = splitted_request
     89 if request_type in {"Invalid column", "Invalid operation"}:
---> 90     raise OutputParserException(
     91         f "{request}. Please check the format instructions."
     92     )
     93 array_exists = re.search(r "(\[.*?\])", request_params)
     94 if array_exists:


OutputParserException: Invalid column: num_fingers. Please check the format instructions.

查看 PandasDataFrameOutputParser (opens in a new tab) 的 API 文档。