Python vs R for Data Science — Which Should You Learn?

Photo: Godfrey Atima / Pexels
If you are starting data science today, Python is the safer first language. In the 2025 Stack Overflow Developer Survey, 57.9% of respondents had used Python in the past year, against 4.9% for R. But that gap describes who writes code of any kind, not who is good at statistics, and the two languages were built for different jobs. This article compares them task by task, with working code, current survey and labor data, and a plain recommendation for each kind of learner.
The short answer, and who it applies to
Learn Python first if you want a data science job in industry, if you plan to build machine learning systems, or if you want one language that also handles scripting, web services, and automation. Learn R first if your work is mostly classical statistics, if you are in a field such as biostatistics or genomics where R is the working language of your colleagues, or if your supervisor already uses it.
Most of the arguments online treat this as a tribal fight. It is closer to choosing between a general-purpose workshop and a specialist's lab. Python gives you a large toolbox that happens to include data analysis. R gives you a tool shaped around data analysis from the start, with fewer places to use it outside that.
The rest of this piece explains why, one layer at a time: history, ecosystems, wrangling, statistics, graphics, machine learning, deployment, learning curve, jobs, and how to combine them.
Where the two languages came from
R grew out of statistics departments. It was initially written by Ross Ihaka and Robert Gentleman at the Department of Statistics of the University of Auckland in New Zealand, and its design was shaped by two earlier languages: S and Scheme. The syntax resembles S, a language developed at Bell Laboratories by John Chambers and colleagues, while the underlying implementation and semantics come from Scheme. Since mid-1997, a group called the R Core Team has controlled changes to the R source code (R Project, R FAQ).
Python was not built for data at all. It is a general-purpose, interpreted language whose own documentation stresses readable syntax and a fast edit-test-debug cycle, because there is no compile step (Python.org). Its data science identity was assembled later, by libraries. The pandas library began in 2008 at AQR Capital Management, an investment firm, and was open sourced by the end of 2009 (pandas project). Scikit-learn began in 2007 as a Google Summer of Code project by David Cournapeau, and its first public release came on February 1, 2010 (scikit-learn project).
That origin story explains most of the differences you will feel. R's defaults assume you are a statistician analyzing a table of observations. Python's defaults assume you are a programmer who has a table among many other things to handle.
What the numbers say about popularity and jobs
Popularity metrics measure different populations, so it helps to look at three of them together.
| Source | Python | R | What it measures |
|---|---|---|---|
| Stack Overflow Developer Survey 2025 | 57.9% of respondents used it | 4.9% of respondents used it | Self-reported use among developers who answered the language question (31,771 respondents) |
| TIOBE Index, October 2026 | Rank 1, 19.23% | Rank 8, 2.06% | Search-engine-based popularity rating across all programming languages |
| CRAN, October 2026 | Not applicable | 25,401 packages | Packages in R's main repository |
| PyPI, October 2026 | 919,743 projects | Not applicable | Projects hosted on Python's package index (all purposes, not only data) |
Sources: Stack Overflow Developer Survey 2025, TIOBE Index, CRAN, PyPI.
Two cautions apply. First, the Stack Overflow survey samples developers, and R users are often analysts, scientists, and statisticians who do not think of themselves as developers, so 4.9% understates R's footprint among people who analyze data for a living. Second, package counts compare badly. PyPI hosts everything from web frameworks to game engines, while CRAN is almost entirely statistics, data, and research software, and CRAN requires packages to pass automated checks before they are accepted.
There is one encouraging trend for R. In the October 2026 TIOBE index it ranks 8th, up from 13th a year earlier, with a rating that rose by 0.55 percentage points. Python's rating fell by 5.23 points over the same period, though it still sits at number one. Neither language is going away.
For the broader field, the U.S. Bureau of Labor Statistics (BLS) reports that data scientists held about 275,600 jobs in 2025, that the median annual wage was $120,230 in May 2025, and that employment is projected to grow 35 percent from 2025 to 2035 (BLS Occupational Outlook Handbook). The BLS does not break pay down by programming language, which matters for the next point.
Why this article no longer quotes salary by language
Earlier versions of comparisons like this one often include a table of average pay for "Python developers" versus "R developers." No government statistics agency publishes such a split, and the figures floating around come from self-selected samples or job-board scrapes with unclear methods. A Python-using machine learning engineer and an R-using biostatistician differ in employer, degree, and seniority long before they differ in language. If someone shows you a clean "Python premium" percentage, ask where the denominator came from.
What you can say with confidence is narrower. Roles that combine analysis with software engineering, such as machine learning engineering, nearly always list Python. Roles in pharmaceutical statistics, public health, and academic research often list R, sometimes alongside SAS or Python. Job postings in your own city and sector are a better guide than any national average.
The core libraries, side by side
Both languages organize data work around a table-like object, a handful of workhorse packages, and a plotting system. The vocabulary differs, but the roles line up.
| Job | Python | R |
|---|---|---|
| Table of data | pandas DataFrame | Built-in data.frame, tidyverse tibble |
| Numerical arrays | NumPy | Built-in vectors and matrices |
| Data wrangling | pandas, Polars | dplyr, tidyr, data.table |
| Statistical models | statsmodels, SciPy | stats (built in), lme4, many specialist packages |
| Machine learning | scikit-learn, XGBoost, PyTorch | tidymodels, caret, xgboost bindings |
| Plotting | Matplotlib, seaborn | ggplot2 |
| Reports | Jupyter, Quarto | R Markdown, Quarto |
| Dashboards | Streamlit, Dash, Shiny for Python | Shiny |
The most important thing in that table is the "Built-in" entries on the R side. In R, the data frame, the vector, the formula syntax, and a long list of statistical tests ship with the language. In Python, you assemble the same capabilities from separate libraries, which is why a new Python user's first week involves installing and importing a lot. That is also why Python's pieces can be swapped: pandas can give way to Polars, Matplotlib to a web-based plotting library, without changing the language.
If you want a one-page list of the Python side, the Python data libraries cheat sheet covers the commonly used calls, and the best data science tools of 2026 compares the wider stack including notebooks, warehouses, and orchestration.
The same task in both languages
The best way to feel the difference is to do one job twice. Suppose you have a file of employee records and want the average salary by department, drawn as a horizontal bar chart.
Python
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("salaries.csv")
dept_avg = df.groupby("department")["salary"].mean().sort_values()
dept_avg.plot(kind="barh")
plt.title("Average Salary by Department")
plt.show()
R
library(dplyr)
library(ggplot2)
df <- read.csv("salaries.csv")
dept_avg <- df %>% group_by(department) %>% summarize(avg = mean(salary))
ggplot(dept_avg, aes(x = avg, y = reorder(department, avg))) +
geom_col() +
ggtitle("Average Salary by Department")
Both produce a sorted bar chart. The Python version reads as a chain of operations on one object: load, group, average, sort, plot. The R version separates the data step from the graphic and builds the graphic in layers. Which feels more natural depends heavily on what you learned first.
A deeper difference sits in the second-to-last Python line. The plot is produced by a method of the pandas Series, which calls Matplotlib behind the scenes. In R, ggplot2 is a separate system with its own model of what a chart is, which is the subject of the visualization section below.
Data wrangling: closer than the rivalry suggests
Cleaning and reshaping data is where most working hours go, and here the two languages are close to a tie. Consider a typical cleaning step: parse dates, drop incomplete rows, and keep only valid ages.
# Python
df["date"] = pd.to_datetime(df["date"])
df = df.dropna()
df = df[df["age"] > 0]
# R with dplyr and tidyr
df <- df %>%
mutate(date = as.Date(date)) %>%
drop_na() %>%
filter(age > 0)
The R version uses the pipe operator %>% to pass the result of each step into the next. The tidyverse, which describes itself as "an opinionated collection of R packages designed for data science," built its style around that idea (tidyverse.org). Recent versions of R also include a native pipe, so the same chain can be written without loading an add-on package. Pandas supports a similar chained style with method calls, such as df.groupby(...).mean().sort_values().
Neither approach is objectively more readable. R's tidyverse reads like a sentence of verbs: filter, group, summarize, arrange. Pandas reads like a series of operations on an object, which feels natural to anyone with a programming background. For the principles behind the work itself, rather than the syntax, see what data cleaning actually involves, since the hard parts (deciding what a missing value means, finding impossible dates) are the same in both.
Speed and large data
Both languages are slow when you write loops over individual rows, and both are fast when you use vectorized operations that run compiled code underneath. Large files expose the difference between libraries rather than between languages. Polars describes itself as an open-source data manipulation library with a multi-threaded query engine written in Rust, and in R the data.table package fills a similar role for speed-sensitive work. If your tables outgrow pandas, the comparison in Polars vs pandas and the in-process SQL option in DuckDB vs pandas are worth reading before you assume you need a different language at all.
Statistical testing: where R's heritage shows
R was written by statisticians, and the standard library behaves like it. Here are four common tasks.
t.test(group1, group2) # two-sample t-test
aov(salary ~ department, data = df) # one-way ANOVA
cor.test(x, y) # correlation with p-value and interval
lm(salary ~ age + department, data = df) # linear regression
The formula salary ~ age + department is a compact way to say "model salary as a function of age and department," and the same syntax works across a huge range of model-fitting functions. Calling summary() on the fitted model prints coefficients, standard errors, test statistics, and p-values in one block.
Python can do all of this, but the pieces come from several libraries.
from scipy import stats
import statsmodels.formula.api as smf
stats.ttest_ind(group1, group2)
stats.f_oneway(group1, group2, group3)
stats.pearsonr(x, y)
model = smf.ols("salary ~ age + department", data=df).fit()
print(model.summary())
SciPy supplies the individual tests, and statsmodels supplies regression with statistical output. Statsmodels describes itself as providing "classes and functions for the estimation of many different statistical models," and it supports specifying models with R-style formulas, which tells you where the idiom came from (statsmodels documentation). Scikit-learn's LinearRegression, by contrast, is built for prediction and does not report p-values, so a statistician moving to Python needs to know to reach for statsmodels.
A default that changes your answer
The two languages do not always make the same choices for you. The R documentation for t.test says that by default the variance is estimated separately for both groups and the Welch modification to the degrees of freedom is used. In SciPy, ttest_ind defaults to equal_var=True, which performs a standard independent two-sample test that assumes equal population variances, and you must pass equal_var=False to get Welch's version (R documentation; SciPy documentation).
So the same two samples, passed to the same-named test with default settings, can produce slightly different p-values. Welch's version is generally the safer choice when group sizes or variances differ, which is one reason statisticians appreciate R's default. The point is not that one language is wrong. It is that you must read the documentation of any test you use, and this is easier to forget in a language where statistics is a library rather than the core.
For the interpretation side, which no language can do for you, read how p-values are misunderstood before you rely on either printout.
Visualization: the grammar of graphics versus a toolbox
R's ggplot2 is described by its maintainers as "a system for declaratively creating graphics, based on The Grammar of Graphics." You supply the data, map variables to visual properties such as position and color, and add layers, scales, and facets (ggplot2.tidyverse.org). The result is that a complex chart, such as scatter plots with a fitted line split by group, is a short, consistent specification.
ggplot(df, aes(x = age, y = salary)) +
geom_point() +
geom_smooth(method = "lm") +
facet_wrap(~department) +
theme_minimal()
The nearest everyday Python equivalent uses seaborn on top of Matplotlib.
import seaborn as sns
import matplotlib.pyplot as plt
sns.lmplot(data=df, x="age", y="salary", col="department", height=4)
plt.show()
For a standard chart, the Python version is shorter. The difference appears when you want something custom. In ggplot2, you extend the same layered specification. In Matplotlib, you often drop down to a more manual level of figure and axis objects, which is powerful but wordier. Python has also grown a library that copies the approach: plotnine describes itself as a data visualization package for Python based on the grammar of graphics, with syntax that resembles ggplot2.
Is ggplot2 the "best visualization library of either language," as some R advocates claim? That is a taste judgment, not a measurement. What can be said is that ggplot2 has a coherent model and a large community built around it, that it has been around for over a decade, and that people who learn it tend to find custom graphics less painful. Python's interactive and web-based options are, in turn, often more convenient for dashboards.
Machine learning: Python's strongest argument
Here the gap is large. Scikit-learn gives Python a consistent interface for classical machine learning: you create a model, call fit, and then predict. Gradient boosting libraries such as XGBoost, and deep learning frameworks such as PyTorch, are developed Python-first. If you intend to train neural networks or work with large language models, the ecosystem is overwhelmingly Python, as covered in PyTorch vs TensorFlow vs JAX and XGBoost explained.
R is not absent. The tidymodels project describes itself as "a collection of packages for modeling and machine learning using tidyverse principles," and the caret package has long been a standard interface for training and tuning models. For classical supervised learning on tables, R can do excellent work. The weaker area is cutting-edge deep learning and the surrounding infrastructure, where R users frequently call Python libraries rather than reimplementing them.
| Task | Python | R |
|---|---|---|
| Linear and logistic regression with inference | Good (statsmodels) | Excellent (built in) |
| Random forests, gradient boosting | Excellent | Good |
| Deep learning | Excellent, the default | Possible, usually via Python backends |
| Pretrained language models | Excellent, the default | Limited |
| Mixed-effects and survival models | Adequate | Excellent |
The ratings in the table reflect where the tooling and community effort sit, not a hard limit on either language. They are a judgment, and they will shift.
If you want a roadmap for that route, the complete ML learning path lays out the order of topics that tends to work.
Deployment: getting a model out of the notebook
A model on your laptop helps nobody. Putting it where an application can call it is where Python's general-purpose design pays off. A minimal Python prediction service looks like this.
from flask import Flask, request
app = Flask(__name__)
@app.route("/predict", methods=["POST"])
def predict():
data = request.json
result = model.predict([data["features"]])
return {"prediction": result.tolist()}
if __name__ == "__main__":
app.run()
Frameworks for building such services, from Flask to FastAPI to Django, are covered in FastAPI vs Flask vs Django. Your data scientists, your backend engineers, and your DevOps team can all read the same language, which is a practical advantage in a company.
R can serve models too, but this is where shops tend to hit friction. The standard R route is Shiny, which turns analysis into an interactive web app.
library(shiny)
ui <- fluidPage(
titlePanel("Prediction"),
sidebarLayout(
sidebarPanel(numericInput("age", "Age:", 0)),
mainPanel(textOutput("prediction"))
)
)
server <- function(input, output) {
output$prediction <- renderText({
predict(model, data.frame(age = input$age))
})
}
shinyApp(ui, server)
Shiny is a good tool for internal dashboards and for sharing analysis with colleagues who do not code. Posit's own Shiny site now shows separate sections for Shiny for R and Shiny for Python, with example apps in both languages (shiny.posit.co), so the dashboard-building idiom is no longer R-exclusive. For lightweight Python apps, Streamlit is another route.
Reproducible reports: a place where they converge
Analysts spend as much time explaining results as computing them. R Markdown made it routine to mix code, output, and prose in one document. Quarto, the successor from Posit, is described on its site as "a multi-language, next generation version of R Markdown from Posit," an open-source publishing system that lets you create dynamic content with Python, R, Julia, and Observable (quarto.org).
In practice this means the reporting argument for R is weaker than it was. A team that writes in Python can produce the same kind of reproducible report, and a mixed team can put Python and R chunks in the same document. Jupyter notebooks remain the more common starting point for Python users, and Quarto can render them.
Learning curve: what trips up beginners
Neither language is hard in the sense that matters, but each has quirks that surprise newcomers. These are the ones that cost real hours.
| Feature | Python | R |
|---|---|---|
| Assignment | x = 5 |
x <- 5 (also = in most places) |
| Indexing starts at | 0 | 1 |
| Slicing end point | Excludes the end index | Includes the end index |
| Missing values | Several representations across libraries (NaN, None, NA in newer pandas types) | A single built-in NA |
| Whitespace | Indentation defines blocks | Braces define blocks |
| Packages | Many installers and environments to choose among | One main repository, installed with install.packages() |
| Error messages | Tracebacks, usually clear | Sometimes terse, especially in pipelines |
Environment management is Python's well-known pain point. A beginner can end up with several Python installations and package managers that disagree. R's single-repository model is simpler for a beginner, even if the language has its own oddities. If you go the Python route, learning a modern environment tool early saves trouble.
R's quirks are more about semantics. Vectorized operations are the default, so a loop is often the wrong instinct. Data frames and factors have their own behaviors that matter for modeling. Many people find R's syntax stranger at first, and Python's more familiar if they have programmed before. People with a statistics background often report the reverse, because the vocabulary of R matches their textbooks.
Domain strengths: bioinformatics, academia, and industry
Fields have their own gravity. In bioinformatics, R's Bioconductor project describes itself as developing and sharing "open source software for precise and repeatable analysis of biological data." Its 3.23 release, dated April 29, 2026, contains 2,418 software packages and works with R 4.6 (Bioconductor). If you work with genomics data, many of the tutorials, vignettes, and reviewers you meet will assume R.
In academic statistics, R is the default of many departments, partly because R was born in one. Newly proposed statistical methods are frequently released first as R packages. That is an observation about common practice rather than a measured share, so treat it as a tendency and not a rule.
In industry, the picture is different. Technology firms, finance, and product-focused teams are more likely to hold their data pipelines, models, and applications in Python, because the same code that trains a model can sit inside a service. Regulated fields such as pharmaceutical development have a long tradition of R and SAS, and your best guide is what the people hiring you actually use.
A career view, without invented salary figures
Instead of a language-by-language pay table, it helps to think in terms of role shapes.
| Role shape | Typical emphasis | Language more likely required |
|---|---|---|
| Data analyst | SQL, spreadsheets, dashboards, some scripting | SQL first, then Python or R |
| Data scientist (product) | Experiments, modeling, communication | Python, often with SQL |
| Machine learning engineer | Training and deploying models | Python |
| Statistician or biostatistician | Study design, inference, reporting | R, often with SAS or Python |
| Research scientist (academia) | Analysis for papers | R or Python, depends on the field |
Three points follow. SQL appears in nearly every analyst job description, so learning it matters more than the Python-or-R decision for your first role. A portfolio of real projects, such as those described in data science portfolio projects, tends to matter more to a hiring manager than the label of one language. And pay depends far more on seniority, location, and sector than on language, which is why this article does not give a percentage for it. For a career path that includes the engineering side, the ML engineer career path shows what the Python route involves.
Can you use both? Yes, in three ways
The either-or framing hides a practical option. The two languages can work together.
- Side by side on one team. An analyst fits models in R while an engineer deploys the output with Python, passing data through files or a database.
- Calling one from the other. The reticulate package describes itself as "a comprehensive set of tools for interoperability between Python and R," embedding a Python session within your R session. In the other direction, rpy2 provides an interface to R running embedded in a Python process.
- One document, two languages. Quarto documents can mix Python and R code.
Because the concepts carry over, learning a second language is faster than learning the first. A data frame, a group-by, a join, a model object, and a plot are the same ideas with different punctuation. How long the second language takes depends on your background and goals, and no source gives a reliable number of weeks, so treat any promised timeline with suspicion. A reasonable plan is to become productive in one language for real projects, then add the other when a project or a job calls for it.
What to pick if you are...
A career changer aiming at an industry data job. Start with Python and SQL. They are the most commonly requested combination for analyst and data scientist roles and cover the largest range of employers.
A student in statistics, economics, or social science. Follow your department. If your courses and advisers use R, use R, and add Python later for machine learning or automation.
A biologist or biostatistician. Learn enough R to use Bioconductor and your field's standard packages. If you later want to build deep learning models on images or sequences, add Python.
A software engineer moving into data. Python, without question. You already know the language family, and the engineering side is where you start with an advantage.
Someone who just wants to analyze data in their current job. Pick whichever language your colleagues use, so that you can share code and get help. Team agreement beats personal taste.
What people get wrong about Python and R
"R is dying." The TIOBE index in October 2026 ranked R 8th, up from 13th a year earlier, and CRAN lists 25,401 packages. R is smaller than Python in developer surveys, but it is not shrinking in any way those sources show.
"Python can't do serious statistics." It can, through statsmodels and SciPy, and many statisticians use it. The more accurate version is that R has a deeper catalogue of specialized methods, especially for classical and biostatistical modeling.
"R can't be used in production." It can, and organizations run R in production. The more accurate statement is that production infrastructure and hiring pipelines are built more around Python, so you will meet more friction.
"You need to master one before touching the other." Not really. The concepts are shared, and many practitioners use both.
"The faster language wins." Speed differences between R and Python in everyday analysis come mostly from the libraries you use and whether you vectorize your code, not from the languages' names. Polars and data.table are fast; slow loops are slow in both.
Frequently Asked Questions
Q: Should I learn Python or R first for data science? A: For most people, Python, because it has the larger developer community, covers machine learning and deployment, and doubles as a general-purpose language. In the 2025 Stack Overflow survey 57.9% of respondents had used Python versus 4.9% for R. If your field or supervisor already uses R, start there.
Q: Is R still worth learning in 2026? A: Yes, in the right setting. The October 2026 TIOBE index ranks R 8th, CRAN has 25,401 packages, and Bioconductor has 2,418 software packages in its latest release. It remains strong in statistics, biostatistics, and genomics.
Q: Can I do machine learning in R? A: Yes. Tidymodels and caret provide interfaces for training and tuning models. Deep learning and large language model work is centered on Python, so R users often call Python libraries through tools such as reticulate.
Q: Which language is faster? A: Neither is fast when you loop over rows. Both are fast when you use vectorized operations or libraries backed by compiled code. For big tables, compare libraries such as Polars, DuckDB, or data.table before switching languages.
Q: Do Python users earn more than R users? A: No reliable public statistic answers this. The BLS reports a median wage of $120,230 for data scientists in May 2025 without splitting by language, and pay depends mostly on role, seniority, location, and sector.
Q: Can I use Python and R together? A: Yes. Reticulate lets R call Python, rpy2 lets Python call R, and Quarto documents can contain code in both languages. Many teams simply divide the work by task.
Q: What about Julia or Rust for data science? A: Both have communities and real strengths, but neither matches Python or R for the number of learning resources and job listings. Polars, a fast data library, is written in Rust but used from Python, so you can benefit from Rust without learning it.
The takeaway
Python wins on breadth: one language for analysis, machine learning, services, and automation, with the biggest community and the clearest path to industry roles. R wins on depth in its home territory: built-in statistics, a coherent graphics system, and domain ecosystems such as Bioconductor. The best question is not which language is better but which one your next two years of work will lean on. If you cannot answer that, start with Python and SQL, and let a real project tell you when R is worth adding.
Read next:
- NumPy Guide — Python's Foundation for Data Science
- How to Handle Missing Data — Imputation Strategies
- How Correlation Differs From Causation
Sources
- Stack Overflow Developer Survey 2025, Technology: Python 57.9%, R 4.9%, 31,771 respondents for the language section.
- TIOBE Index: ranks and ratings for October 2026.
- U.S. Bureau of Labor Statistics, Data Scientists: employment, median pay, and growth projection.
- CRAN package repository: number of available packages.
- Bioconductor release announcements: release 3.23.
- R FAQ: origin of R.
- pandas, About and scikit-learn, About us: project histories.
- R documentation for t.test and SciPy documentation for ttest_ind: default behaviors.
- ggplot2, tidyverse, tidymodels, Quarto, Shiny, reticulate, rpy2, statsmodels, Polars, plotnine: project self-descriptions.
Last verified: October 19, 2026
Follow new articles
Add SciHub101 to your feed reader to see new science and technology stories.
About the Author
SciHub101 is an independent science and technology publication founded and edited by Buğra Sözeri, a software engineer and app developer based in Türkiye. AI tools assist with drafting and research. Source documentation in the existing archive is uneven, and articles are being reviewed and corrected. The Editorial Team byline identifies editorial responsibility; it does not certify specialist or independent human review. Where we compare products, anything built by our own team is labelled as such — see the editorial guidelines and About page for how corrections and disclosures work.
Related Articles

Data Cleaning: 80% of Data Scientist's Job (Explained)
Why data cleaning takes 80% of a data scientist's time: common issues, pandas workflows, automation tips, and how to clean datasets efficiently in Python.

Build Data Science Portfolio — Projects That Get Hired
Build a data science portfolio that shows real skills: five project types, a clean GitHub structure, honest metrics, and write-ups hiring teams can read.

How to Learn Python: A Complete Guide for Beginners in 2026
Python is a sensible first language: readable syntax, a huge library ecosystem, and use in web, data, and automation work. This guide covers setup, a phased learning path, free courses, debugging, learning with AI assistants, and a project ladder.

Python for Data Science: Complete Guide 2026
Master Python for data science in 2026. Covers essential libraries, workflows, career paths, and learning roadmap with real examples.

NumPy Guide — Python's Foundation for Data Science
Learn NumPy from scratch — arrays, broadcasting, vectorization, indexing, and linear algebra. The bedrock library behind pandas, scikit-learn, and PyTorch.

Pandas Python Guide — Data Analysis for Beginners
Learn pandas: DataFrames, loading, cleaning, groupby, merging, and plotting, with pandas 3.0 code examples and a full CSV-to-insight analysis pipeline.