Create Pivot Tables Online from CSV and Excel Files
Cross-tabulate your data instantly. Reshape rows and columns into a summary pivot table without Excel or SQL.
How to Create Pivot Table
A complete guide to configuring your data pipeline.
Step 1: Defining the Index
Open the Pivot tool. In the Index field, enter the column whose unique values will form the rows of your pivot table (e.g., Product or $1).
Step 2: Setting the Columns and Values
In the Columns field, enter the column whose unique values will spread across the header row (e.g., Month or Region). In the Values field, enter the numeric column to aggregate at each intersection (e.g., Revenue).
Step 3: Reading the Result
The output table shows one row per unique index value and one column per unique column value. Each cell contains the mean of matching records. Multi-level headers are automatically flattened into single readable names (e.g., Revenue_North), so the result exports cleanly to any tool.
Technical Specifications & Use Cases
Pivot tables are the most powerful summarization structure in data analysis, but they are also notoriously fragile in spreadsheet software — a single misclick can silently corrupt the entire cross-tabulation.
flowingTable builds pivot tables using pandas.pivot_table(), which applies an exact aggregation function across every index-column intersection simultaneously. Multi-level column headers, which typically require complex workarounds in Excel, are automatically flattened into clean single-row headers before export, ensuring full compatibility with downstream analytics tools and databases.
Frequently Asked Questions
What is the structural difference between a pivot table and a simple group-by aggregation?
A group-by aggregation produces a one-dimensional summary: each unique value in your grouping column becomes one row in a two-column output table. A pivot table produces a two-dimensional cross-tabulation: unique values from the Index column form the rows, while unique values from the Columns field spread across the header row, creating a matrix of intersecting metrics. For example, a group-by can tell you 'total revenue per region', while a pivot table can tell you 'total revenue per region broken down by product category simultaneously', displaying the full Revenue × Region × Category matrix in a single compact table.
What happens when the same index-column combination appears multiple times in my source data?
When multiple source rows map to the same cell in the pivot table — for example, multiple sales records for 'North' region and 'January' — the engine automatically aggregates all matching values using the mean function by default. This means the cell value represents the arithmetic average of all records sharing that specific index-column intersection. If you need a sum instead of a mean for your use case, this is an important distinction: a pivot table cell showing 250 may represent two records of 100 and 400 averaged, not a total of 700.
Why are multi-level column headers automatically flattened in the output, and why does this matter?
When pandas generates a pivot table, it creates a hierarchical MultiIndex for the column headers — for example, a two-level header of ('Revenue', 'North') stacked on top of ('Revenue', 'South'). Most databases, CSV parsers, and visualization tools cannot handle multi-level headers and will either throw an import error or misread the structure. The flattening process collapses these into single-level strings like 'Revenue_North' and 'Revenue_South', making the output immediately compatible with SQL imports, BI tools like Tableau and Power BI, and any standard data pipeline without requiring manual post-processing.
Can I create a pivot table that counts the number of records at each intersection instead of summing a numeric value?
Yes. To generate a count-based pivot table, enter any column (including a non-numeric one like a 'Status' or 'ID' column) in the Values field. When the aggregation function is applied to a column containing text values, it automatically performs a count of non-null records at each intersection rather than attempting a numeric sum. This is useful for generating frequency matrices — for example, a table showing the number of support tickets per department per month — without needing a dedicated numeric counter column in your source data.