---
title: Loop
slug: /loop
---

import Icon from "@site/src/components/icon";
import PartialParams from '@site/docs/_partial-hidden-params.mdx';

The **Loop** component iterates over a list of input by passing individual items to other components attached at the **Item** output port until there are no items left to process.
Then, the **Loop** component passes the aggregated result of all looping to the component connected to the **Done** port.

## The looping process

The **Loop** component is like a miniature flow within your flow.
Here's a breakdown of the looping process:

1. Accepts a list of [`Data`](/data-types#data) or [`DataFrame`](/data-types#dataframe) objects, such as a CSV file, through the **Loop** component's **Inputs** port.

2. Splits the input into individual items. For example, a CSV file is broken down by rows.

    Specifically, the **Loop** component repeatedly extracts items by `text` key in the `Data` or `DataFrame` objects until there are no more items to extract.
    Each `item` output is a `Data` objects.

3. Iterates over each `item` by passing them to the **Item** output port.

    This port connects to one or more components that perform actions on each item.
    The final component in the **Item** loop connects back to the **Loop** component's **Looping** port to process the next item.

    Only one component connects to the **Item** port, but you can pass the data through as many components as you need, as long as the last component in the chain connects back to the **Looping** port.

    The [**If-Else** component](/if-else) isn't compatible with the **Loop** component.
    For more information, see [Conditional looping](#conditional-looping).

4. After processing all items, the results are aggregated into a single `Data` object that is passed from the **Loop** component's **Done** port to the next component in the flow.

The following simplified Python code summarizes how the **Loop** component works.
This _isn't_ the actual component code; it is only meant to help you understand the general process.

```python
for i in input:             # Receive input data as a list
    process_item(i)         # Process each item through components connected at the Item port
    if has_more_items():
        continue            # Loop back to Looping port to process the next item
    else:
        break               # Exit the loop when no more items are left

done = aggregate_results()  # Compile all returned items

print(done)                 # Send the aggregated results from the Done port to another component
```

## Loop example

In the follow example, the **Loop** component iterates over a CSV file until there are no rows left to process.
In this case, the **Item** port passes each row to a **Type Convert** component to convert the row into a `Message` object, passes the `Message` to a **Structured Output** component to be processed into structured data that is then passed back to the **Loop** component's **Looping** port.
After processing all rows, the **Loop** component loads the aggregated list of structured data into a Chroma DB database through the **Chroma DB** component connected to the **Done** port.

![Loop CSV parser](/img/component-loop-csv.png)

:::tip
For more examples of the **Loop** component, try the **Research Translation Loop** template in Langflow, or see the video tutorial [Mastering the Loop Component & Agentic RAG in Langflow](https://www.youtube.com/watch?v=9Wx7WODSKTo).
:::

## Conditional looping

The [**If-Else** component](/if-else) isn't compatible with the **Loop** component.
If you need conditional loop events, redesign your flow to process conditions before the loop.
For example, if you are looping over a `DataFrame`, you could use multiple [**DataFrame Operations** components](/dataframe-operations) to conditionally filter data, and then run separate loops on each set of filtered data.

![A flow with conditional looping.](/img/conditional-looping.png)

