A chart from ChatGPT looks authoritative: neat axes, clean colors, plausible numbers. That is exactly the danger. Behind the chart is Python code that can be silently wrong. It might have summed the wrong column, parsed a numeric field as text so every total is off, or applied an “outlier filter” that quietly dropped a third of your rows. The chart still renders beautifully. This workflow is the friction that catches those mistakes before the chart lands in a deck or a board meeting. It is written for people who run occasional analysis but are not full-time analysts: operators, PMs, indie founders, and researchers.
TL;DR
- ChatGPT’s data analysis feature (the rebranded Code Interpreter) runs a real sandboxed Python environment, not a guess. As of June 2026 it ships with 330+ libraries preinstalled, including pandas, matplotlib, and scikit-learn.
- File limits as of June 2026: 512MB hard cap per file, but spreadsheets choke well before that. Keep CSVs under ~50MB and a few hundred thousand rows. Plus allows 80 uploads per 3-hour window and 10 files per message.
- The single highest-value habit: for every chart or number, ask to see the code and the raw totals it was built from. Pretty does not mean correct.
- The sandbox is ephemeral.
/mnt/datais wiped when the session ends, so export your cleaned data before you close the tab. - Never upload PII or financial data to a personal account with training left on. Use Temporary Chat, turn off model training, or strip identifiers first.
When this workflow fits, and when it does not
| Good fit | Wrong tool |
|---|---|
| Cleaning a messy one-off CSV | Production data pipelines |
| Producing a single chart for a report | Anything reproducible by a team on a schedule |
| Comparing two small datasets | Datasets above a few hundred thousand rows |
| A quick summary table | Files containing PII or regulated financial data |
For recurring or reproducible work, save the final Python and run it in a real notebook instead.
What the data analysis feature actually is
When you upload a CSV, Excel file, or JSON to ChatGPT and ask it to analyze, it does not “read” the file into the chat. It writes Python, executes that code in a sandboxed container on OpenAI’s servers, and reports back the results plus any chart it generated. As of June 2026 the default model is GPT-5.5, and the sandbox comes with 330+ libraries already installed (pandas for tables, matplotlib and seaborn for charts, scikit-learn for modeling, Pillow for images).
Two consequences flow from this design, and they shape the entire workflow:
- The output is only as good as the code. A confident answer can rest on a one-line bug you never saw. So you make the code visible.
- The container is temporary. Files written to
/mnt/datasurvive across steps within one session but vanish when the session ends. So you export early and often.
Which tier do you need?
As of June 2026, full data analysis with file uploads and code execution lives on the paid tiers. ChatGPT Plus ($20/month) is the practical default and includes it with an 80-message-per-3-hour cap. The Free tier ($0) has tightened toward text-only handling of uploads, so do not rely on it for real computation. The $200 Pro tier adds far higher limits and the 1M-token in-app context if you routinely push large files.
The workflow, step by step
- Start in a privacy-safe chat. Before uploading anything sensitive, open a Temporary Chat or go to Settings > Data Controls and turn off “Improve the model for everyone.” For genuinely sensitive data, use a Business/Enterprise workspace, which is excluded from training by default.
- Upload one file at a time. Multiple files in one prompt makes it harder to tell which one a result came from. Keep spreadsheets under ~50MB.
- Profile before you analyze. Ask: “Describe this file: list every column, its inferred dtype, the row count, and the null count per column. Do not chart anything yet.” This is where you catch the silent killer, a numeric column read as a string, before it poisons every downstream total.
- Show the code for every chart. Add “and print the Python you ran” to every analysis request. If the code is wrong, the chart is wrong.
- Cross-check the totals. Ask it to print the
sum()orcount()of the column being analyzed, then verify that figure against your raw file (open it in Excel or Numbers and check). Numbers that do not reconcile are your early warning. - Sanity-check groups and filters. For any group-by or filter, ask: “Show me 5 sample rows from each group” and “How many rows did the filter drop, and on what rule?” Never let it define “outliers” without showing you the threshold.
- Export at checkpoints. Ask for the cleaned dataset as a downloadable CSV after each major transform. Recovery insurance against the session expiring mid-analysis.
- Save the final code. For anything you might repeat, copy the final Python out. Running it yourself next time is faster and fully reproducible.
Worked example: cleaning a sales CSV
Upload sales.csv → ask for the column/dtype/null profile → notice revenue came in as a string because of currency symbols → ask “strip the $ and commas, cast revenue to float, and confirm the new dtype” → ask “show me the 5 rows where revenue is null” → decide drop or impute → “group by month, sum revenue, and print both the table and the Python” → cross-check one month’s total against the raw file → export the cleaned CSV.
Common mistakes
- Trusting the chart without the code or the totals behind it. This is the one mistake that produces wrong numbers in a polished wrapper.
- Skipping the profile step. Going straight to charting when a numeric column was parsed as text silently breaks every aggregation downstream.
- Letting it define “outliers” for you. Always ask for the rule and the row count dropped.
- Asking for “insights” instead of specific questions. Vague prompts return a generic-sounding paragraph. Ask “which 3 products had the largest month-over-month revenue drop in Q1?” instead.
- Uploading PII or financials with training on. Use Temporary Chat, disable training, or strip identifiers before upload.
- Letting the sandbox expire without exporting.
/mnt/datais wiped at session end. “I can reload this tomorrow” is not true.
Advanced tips
- Ask for the SQL equivalent. “Show the SQL that would produce this analysis” is a fast way to learn the logic or migrate to a real database.
- Pin the dtypes up front. If you know
order_idshould be a string andqtyan int, say so in the profile step so pandas does not guess wrong. - Use checkpoints for long sessions. A few-minute execution limit per step plus an expiring container means a 40-step analysis is fragile. Export the intermediate dataset every few steps.
Output checklist
- Every number in the final summary traces back to a column and a Python operation you actually saw printed.
- You have reconciled at least one aggregate (a monthly total, a group count) against the raw file.
- No PII remains in the uploaded file, and training was off (or you used Temporary Chat).
- The cleaned dataset is exported and saved locally, not stranded in an expired sandbox.
FAQ
- Does ChatGPT really run Python on my data?: Yes. The data analysis feature (formerly Code Interpreter) executes real Python in a sandboxed container on OpenAI’s servers, with 330+ libraries including pandas and matplotlib preinstalled as of June 2026.
- What are the file size limits?: As of June 2026 the hard cap is 512MB per file, but spreadsheets get slow and unreliable well before that. Keep CSVs under roughly 50MB and a few hundred thousand rows. Plus allows 80 uploads per 3-hour window and 10 files per message.
- Is my uploaded CSV stored or used for training?: Files are tied to your account (per-user storage is capped at 25GB). On personal tiers, turn off “Improve the model for everyone” in Settings > Data Controls, or use Temporary Chat. Business and Enterprise workspaces are excluded from training by default. Avoid uploading PII regardless.
- Should I use the fast model or the thinking model?: For basic profiling and single group-bys, the default Instant mode of GPT-5.5 is fine. For multi-step analysis you cannot easily verify, switch to Thinking. The picker is in the model menu.
- What if my file is too big?: Sample it locally first (say 100k rows) and analyze the sample. If you genuinely need the full dataset, move to a real notebook. ChatGPT will silently sample a too-large file anyway, which is worse than knowing you sampled.
- Why does my session lose the cleaned data?: The sandbox is ephemeral. The
/mnt/dataworkspace is wiped when the session ends, and execution time per step is limited to a few minutes. Export cleaned data as a CSV at every checkpoint.