FutureSearch Logofuturesearch
  • Blog
  • Solutions
  • Research
  • Docs
  • Evals
  • Company
  • Get Researchers
FutureSearch Logo

General inquiry? You can reach us at hello@futuresearch.ai.

Company

Team & CareersPressPrivacy PolicyTerms of Service

Developers

SDK DocsAPI ReferenceCase StudiesGitHub

Follow Us

X (Twitter)@dschwarz26LinkedIn
FutureSearchdocs
Your research team
Installation
  • All install methods
  • Claude.ai
  • Claude Cowork
  • Claude Code
  • Web App
  • Python SDK
  • Skill
  • MCP Server
Reference
  • API Key
  • classify
  • dedupe
  • forecast
  • merge
  • rank
  • agent_map
  • screen
  • Progress Monitoring
  • Chaining Operations
Guides
  • LLM-Powered Data Labeling
  • Add a Column via Web Research
  • Classify and Label Rows
  • Deduplicate Training Data
  • Filter a Dataset Intelligently
  • Join Tables Without Shared Keys
  • Rank Data by External Metrics
  • Resolve Duplicate Entities
  • Scale Deduplication to 20K Rows
Case Studies
  • Deduplicate Contact Lists
  • Deduplicate CRM Records
  • Enrich Contacts with Company Data
  • Fuzzy Match Across Tables
  • Link Records Across Medical Datasets
  • LLM Cost vs. Accuracy
  • Merge Costs and Speed
  • Merge Thousands of Records
  • Multi-Stage Lead Qualification
  • Research and Rank Web Data
  • Run 10,000 LLM Web Research Agents
  • Score Cold Leads via Web Research
  • Score Leads from Fragmented Data
  • Screen 10,000 Rows
  • Screen Job Listings
  • Screen Stocks by Economic Sensitivity
  • Screen Stocks by Investment Thesis
FutureSearchby futuresearch
by futuresearch

Classify and Label Rows

Go to futuresearch.ai/app, upload hn_jobs_classify.csv, and enter:

Classify each row by primary engineering role. Use these categories: backend, frontend, fullstack, data, ml_ai, devops_sre, mobile, security, other. For each row, return the category and a short reasoning.

All 200 rows classified in about a minute. Fullstack dominates at 44% because HN "Who's Hiring" posts are predominantly from startups.

Add the everyrow connector if you haven't already. Then upload hn_jobs_classify.csv and ask Claude:

Classify each row by primary engineering role. Use these categories: backend, frontend, fullstack, data, ml_ai, devops_sre, mobile, security, other. For each row, return the category and a short reasoning.

All 200 rows classified in about a minute. Fullstack dominates at 44% because HN "Who's Hiring" posts are predominantly from startups.

Claude Code's text processing works for classifying a few dozen items in a single prompt. When you have 200 rows that each need consistent, structured labels across 9 categories, you need batched parallel evaluation with a fixed schema.

Here, we get Claude Code to classify 200 job postings into 9 role categories in under a minute for $1.53.

MetricValue
Rows200
Time1.0 minutes
Cost$1.53
Cost per row$0.008

Add everyrow to Claude Code if you haven't already:

claude mcp add futuresearch --scope project --transport http https://mcp.futuresearch.ai/mcp

Download the dataset: hn_jobs_classify.csv (3,616 Hacker News "Who's Hiring" posts). With the CSV in your working directory, tell Claude:

Classify each row in hn_jobs_classify.csv by primary engineering role. Use these categories:
backend, frontend, fullstack, data, ml_ai, devops_sre, mobile, security, other.

For each row, return the category and a short reasoning.

Claude calls everyrow's agent MCP tool with your schema, then polls for progress:

Tool: everyrow_agent
├─ task: "Classify this job posting by primary role: backend, frontend, fullstack..."
├─ input_csv: "/Users/you/hn_jobs_classify.csv"
└─ response_schema: {"category": "enum", "reasoning": "string"}

→ Submitted: 200 rows for processing.
  Session: https://futuresearch.ai/sessions/4d82663b-c681-4b12-a48a-17533f162b51
  Task ID: 4d82...

Tool: everyrow_progress
├─ task_id: "4d82..."
→ Running: 0/200 complete, 200 running (10s elapsed)

Tool: everyrow_progress
→ Running: 100/200 complete, 100 running (30s elapsed)

...

Tool: everyrow_progress
→ Completed: 200/200 (0 failed) in 59s.

Tool: everyrow_results
├─ task_id: "4d82..."
├─ output_path: "/Users/you/classified_jobs.csv"
→ Saved 200 rows to /Users/you/classified_jobs.csv

All 200 rows classified in 59 seconds. View the session.

CategoryCount%
fullstack8844.0%
other3216.0%
backend2110.5%
ml_ai2010.0%
data136.5%
mobile94.5%
devops_sre84.0%
frontend63.0%
security31.5%

Fullstack dominates (44%) because Hacker News "Who's Hiring" posts are predominantly from startups hiring generalist engineers.

The everyrow Python SDK orchestrates thousands of parallel LLM evaluations in a single function call, for classification tasks that require judgment on every row.

Here, we classify 200 job postings into 9 categories in 2 minutes for $1.74.

MetricValue
Rows200
Time2.1 minutes
Cost$1.74
Cost per row$0.009

View the session

If you're categorizing support tickets, labeling training data, or tagging content by topic, string heuristic or embedding techniques are low accuracy, but training a model is a very high lift. LLMs make it possible to solve this efficiently.

pip install everyrow
export EVERYROW_API_KEY=your_key_here  # Get one at futuresearch.ai

The agent_map function processes each row in parallel with structured output via Pydantic models. You define the schema, describe the task, and get back a DataFrame with your new columns. To follow along, right click this link and save the CSV file to your computer.

import asyncio
from typing import Literal

import pandas as pd
from pydantic import BaseModel, Field

from everyrow.ops import agent_map


class JobClassification(BaseModel):
    category: Literal[
        "backend", "frontend", "fullstack", "data",
        "ml_ai", "devops_sre", "mobile", "security", "other"
    ] = Field(description="Primary role category")
    reasoning: str = Field(description="Why this category was chosen")


async def main():
    jobs = pd.read_csv("hn_jobs_classify.csv")

    result = await agent_map(
        task="""Classify this job posting by primary role:
        - backend: Server-side, API development
        - frontend: UI, web development
        - fullstack: Both frontend and backend
        - data: Data engineering, pipelines, analytics
        - ml_ai: Machine learning, AI, deep learning
        - devops_sre: Infrastructure, platform engineering
        - mobile: iOS, Android development
        - security: Security engineering
        - other: Product, design, management, etc.
        """,
        input=jobs,
        response_model=JobClassification,
    )

    print(result.data[["id", "category", "reasoning"]])


asyncio.run(main())

The output DataFrame includes your original columns plus category and reasoning:

          id    category  reasoning
0   46469380   fullstack  Role spans React frontend and Django backend...
1   46134153   fullstack  Title is "Fullstack Engineer (with DevOps focus)"...
2   46113062     backend  Company builds API platform tooling...
3   46467458       ml_ai  First role listed is ML Engineer...
4   46466466       other  Primary role is Founding Product Manager...

Use Python's Literal type to restrict classifications to specific values. The LLM is constrained to only return values from this set. No post-processing or validation needed.

For cases where multiple labels can apply, use a list:

class MultiLabel(BaseModel):
    tags: list[str] = Field(description="All applicable tags for this item")
    primary_tag: str = Field(description="The most relevant tag")

Without web research agents, everyrow can classify data for ~$0.009 per row, or 10,000 rows for ~$90. The exact cost depends on input length and the complexity of your response model.

RowsEstimated CostEstimated Time
100~$1~1 min
1,000~$9~5 min
10,000~$90~30 min

Built with everyrow. See the agent_map documentation for more options including response models and effort levels.