Pandas
What I do
I provide powerful data manipulation and analysis capabilities through DataFrame and Series data structures. I enable you to load data from various sources, clean and preprocess data, perform complex transformations, aggregate and group data, handle missing values, merge datasets, and conduct exploratory data analysis. I am the foundational tool for data science workflows in Python.
When to use me
- Loading and exporting data (CSV, Excel, JSON, SQL databases)
- Cleaning and preprocessing messy datasets
- Filtering and selecting specific data subsets
- Handling missing or corrupted data
- Transforming and creating new features
- Grouping and aggregating data
- Merging and joining multiple datasets
- Time series analysis and resampling
- Statistical analysis on tabular data
Core Concepts
Data Structures
- Series: One-dimensional labeled array with homogeneous data
- DataFrame: Two-dimensional labeled data structure with columns of potentially different types
- Index: Labels for rows and columns, supports hierarchical (multi-index) structures
Data Operations
- Selection:
.loc[] for label-based, .iloc[] for integer-based selection
- Filtering: Boolean indexing with conditions
- Sorting:
.sort_values() and .sort_index()
- Mapping:
.apply(), .map(), .applymap() for element-wise operations
Data Cleaning
- Missing Data:
isna(), dropna(), fillna(), interpolate()
- Duplicates:
duplicated(), drop_duplicates()
- Data Types:
astype(), infer_objects()
- String Operations:
.str accessor with regex support
Aggregation
- GroupBy:
.groupby() for split-apply-combine operations
- Aggregation:
.agg(), .aggregate() with multiple functions
- Transformation:
.transform() maintaining original shape
- Window Functions:
.rolling(), .expanding(), .ewm()
Merging and Joining
- Concatenation:
pd.concat() for combining along axes
- Merging:
pd.merge() for SQL-style joins (inner, outer, left, right)
- Join: DataFrame method for index-based joining
Code Examples (Python)
import pandas as pd
import numpy as np
# Creating DataFrames
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 40],
'salary': [50000, 60000, 75000, 90000],
'department': ['Engineering', 'Sales', 'Engineering', 'Marketing']
})
# Loading data
df = pd.read_csv('data.csv', parse_dates=['date'], index_col='id')
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df = pd.read_json('data.json')
df = pd.read_sql('SELECT * FROM table', connection)
# Data selection
df['name'] # Single column as Series
df[['name', 'salary']] # Multiple columns
df.loc['row1':'row5', 'name':'salary'] # Label-based
df.iloc[0:5, 0:3] # Integer-based
# Filtering
df[df['age'] > 30]
df[(df['age'] > 30) & (df['department'] == 'Engineering')]
df[df['name'].str.contains('Alice|Bob')]
# Data cleaning
df.isnull().sum() # Missing values
df.dropna(thresh=len(df.columns)-2) # Drop rows with too many NaN
df.fillna({'age': df['age'].median()}) # Fill specific columns
df.duplicated().sum() # Count duplicates
df.drop_duplicates(subset=['name'], keep='first')
# String operations
df['name'].str.lower()
df['email'].str.extract(r'@(.+)$')
df['department'].str.replace('Engineering', 'Eng')
# Type conversion
df['age'] = df['age'].astype(int)
df['salary'] = pd.to_numeric(df['salary'], errors='coerce')
# Sorting
df.sort_values('salary', ascending=False)
df.sort_values(['department', 'salary'], ascending=[True, False])
df.sort_index()
# Grouping and aggregation
df.groupby('department').agg({
'salary': ['mean', 'max', 'min'],
'age': 'mean'
})
df.groupby('department')['salary'].transform('mean')
# Pivot tables
pd.pivot_table(df, values='salary', index='department',
columns='year', aggfunc='mean')
# Merging
df1 = pd.DataFrame({'id': [1, 2, 3], 'name': ['A', 'B', 'C']})
df2 = pd.DataFrame({'id': [1, 2, 4], 'salary': [50000, 60000, 70000]})
merged = pd.merge(df1, df2, on='id', how='outer')
# Concatenation
pd.concat([df1, df2], ignore_index=True)
pd.concat([df1, df2], axis=1)
# Time series
df.set_index('date', inplace=True)
df.resample('M').mean() # Monthly aggregation
df.rolling(window=7).mean() # 7-day rolling average
df.expanding().sum() # Cumulative sum
df.diff() # Difference between consecutive values
# Statistical operations
df.describe()
df.corr()
df.cov()
df['salary'].value_counts()
df['department'].nunique()
# Apply functions
def categorize_age(age):
if age < 30:
return 'Young'
elif age < 50:
return 'Middle'
else:
return 'Senior'
df['age_category'] = df['age'].apply(categorize_age)
df['salary_log'] = df['salary'].apply(np.log)
# Exporting data
df.to_csv('output.csv', index=False)
df.to_excel('output.xlsx', sheet_name='Data')
df.to_json('output.json', orient='records')
Best Practices
Use vectorized operations: Avoid loops; pandas operations are optimized for vectorized execution.
Chain operations for readability: Use method chaining with assign(), pipe(), and successive operations.
Specify dtypes explicitly: When loading data, specify column types to avoid inference overhead.
Use appropriate index: Set meaningful indices (dates, IDs) for efficient operations.
Avoid chained indexing: Use .loc[] and .iloc[] with tuple indices instead of df[col][row].
Memory optimization: Use category dtype for low-cardinality strings, downcast for numeric types.
Use appropriate file formats: Parquet for speed and compression, CSV for interoperability.
Handle SettingWithCopy warnings: Understand pandas copy/view semantics and use .copy() when needed.
Common Patterns
Pattern 1: Exploratory Data Analysis Pipeline
def eda_pipeline(df):
# Basic info
info = {
'shape': df.shape,
'dtypes': df.dtypes,
'missing': df.isnull().sum(),
'describe': df.describe()
}
# Categorical analysis
cat_cols = df.select_dtypes(include=['object']).columns
cat_summary = {col: {'unique': df[col].nunique(),
'top': df[col].value_counts().head()}
for col in cat_cols}
# Numerical analysis
num_cols = df.select_dtypes(include=[np.number]).columns
num_summary = df[num_cols].corr()
return info, cat_summary, num_summary
Pattern 2: Data Cleaning Pipeline
def clean_data(df):
# Remove duplicates
df = df.drop_duplicates()
# Handle missing values
numeric_cols = df.select_dtypes(include=[np.number]).columns
categorical_cols = df.select_dtypes(include=['object']).columns
df[numeric_cols] = df[numeric_cols].fillna(df[numeric_cols].median())
df[categorical_cols] = df[categorical_cols].fillna(df[categorical_cols].mode().iloc[0])
# Remove outliers (IQR method)
for col in numeric_cols:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
df = df[(df[col] >= Q1 - 1.5*IQR) & (df[col] <= Q3 + 1.5*IQR)]
# Standardize text
for col in categorical_cols:
df[col] = df[col].str.strip().str.lower()
return df
Pattern 3: Feature Engineering from Raw Data
def engineer_features(df):
# Create features
df = df.assign(
age_group=lambda x: pd.cut(x['age'], bins=[0, 25, 35, 50, 100],
labels=['young', 'adult', 'middle', 'senior']),
salary_per_year_exp=lambda x: x['salary'] / (x['years_exp'] + 1),
is_senior=lambda x: (x['age'] > 40).astype(int)
)
# One-hot encoding
df = pd.get_dummies(df, columns=['department', 'gender'], drop_first=True)
# Interaction features
df['exp_salary_product'] = df['years_exp'] * df['salary']
return df
1---2name: pandas3description: Data manipulation and analysis library providing data structures and tools for cleaning, transforming, aggregating, and analyzing tabular data.4---56# Pandas78## What I do910I provide powerful data manipulation and analysis capabilities through DataFrame and Series data structures. I enable you to load data from various sources, clean and preprocess data, perform complex transformations, aggregate and group data, handle missing values, merge datasets, and conduct exploratory data analysis. I am the foundational tool for data science workflows in Python.1112## When to use me1314- Loading and exporting data (CSV, Excel, JSON, SQL databases)15- Cleaning and preprocessing messy datasets16- Filtering and selecting specific data subsets17- Handling missing or corrupted data18- Transforming and creating new features19- Grouping and aggregating data20- Merging and joining multiple datasets21- Time series analysis and resampling22- Statistical analysis on tabular data2324## Core Concepts2526### Data Structures27- **Series**: One-dimensional labeled array with homogeneous data28- **DataFrame**: Two-dimensional labeled data structure with columns of potentially different types29- **Index**: Labels for rows and columns, supports hierarchical (multi-index) structures3031### Data Operations32- **Selection**: `.loc[]` for label-based, `.iloc[]` for integer-based selection33- **Filtering**: Boolean indexing with conditions34- **Sorting**: `.sort_values()` and `.sort_index()`35- **Mapping**: `.apply()`, `.map()`, `.applymap()` for element-wise operations3637### Data Cleaning38- **Missing Data**: `isna()`, `dropna()`, `fillna()`, `interpolate()`39- **Duplicates**: `duplicated()`, `drop_duplicates()`40- **Data Types**: `astype()`, `infer_objects()`41- **String Operations**: `.str` accessor with regex support4243### Aggregation44- **GroupBy**: `.groupby()` for split-apply-combine operations45- **Aggregation**: `.agg()`, `.aggregate()` with multiple functions46- **Transformation**: `.transform()` maintaining original shape47- **Window Functions**: `.rolling()`, `.expanding()`, `.ewm()`4849### Merging and Joining50- **Concatenation**: `pd.concat()` for combining along axes51- **Merging**: `pd.merge()` for SQL-style joins (inner, outer, left, right)52- **Join**: DataFrame method for index-based joining5354## Code Examples (Python)5556```python57import pandas as pd58import numpy as np5960# Creating DataFrames61df = pd.DataFrame({62 'name': ['Alice', 'Bob', 'Charlie', 'David'],63 'age': [25, 30, 35, 40],64 'salary': [50000, 60000, 75000, 90000],65 'department': ['Engineering', 'Sales', 'Engineering', 'Marketing']66})6768# Loading data69df = pd.read_csv('data.csv', parse_dates=['date'], index_col='id')70df = pd.read_excel('data.xlsx', sheet_name='Sheet1')71df = pd.read_json('data.json')72df = pd.read_sql('SELECT * FROM table', connection)7374# Data selection75df['name'] # Single column as Series76df[['name', 'salary']] # Multiple columns77df.loc['row1':'row5', 'name':'salary'] # Label-based78df.iloc[0:5, 0:3] # Integer-based7980# Filtering81df[df['age'] > 30]82df[(df['age'] > 30) & (df['department'] == 'Engineering')]83df[df['name'].str.contains('Alice|Bob')]8485# Data cleaning86df.isnull().sum() # Missing values87df.dropna(thresh=len(df.columns)-2) # Drop rows with too many NaN88df.fillna({'age': df['age'].median()}) # Fill specific columns89df.duplicated().sum() # Count duplicates90df.drop_duplicates(subset=['name'], keep='first')9192# String operations93df['name'].str.lower()94df['email'].str.extract(r'@(.+)$')95df['department'].str.replace('Engineering', 'Eng')9697# Type conversion98df['age'] = df['age'].astype(int)99df['salary'] = pd.to_numeric(df['salary'], errors='coerce')100101# Sorting102df.sort_values('salary', ascending=False)103df.sort_values(['department', 'salary'], ascending=[True, False])104df.sort_index()105106# Grouping and aggregation107df.groupby('department').agg({108 'salary': ['mean', 'max', 'min'],109 'age': 'mean'110})111df.groupby('department')['salary'].transform('mean')112113# Pivot tables114pd.pivot_table(df, values='salary', index='department', 115 columns='year', aggfunc='mean')116117# Merging118df1 = pd.DataFrame({'id': [1, 2, 3], 'name': ['A', 'B', 'C']})119df2 = pd.DataFrame({'id': [1, 2, 4], 'salary': [50000, 60000, 70000]})120merged = pd.merge(df1, df2, on='id', how='outer')121122# Concatenation123pd.concat([df1, df2], ignore_index=True)124pd.concat([df1, df2], axis=1)125126# Time series127df.set_index('date', inplace=True)128df.resample('M').mean() # Monthly aggregation129df.rolling(window=7).mean() # 7-day rolling average130df.expanding().sum() # Cumulative sum131df.diff() # Difference between consecutive values132133# Statistical operations134df.describe()135df.corr()136df.cov()137df['salary'].value_counts()138df['department'].nunique()139140# Apply functions141def categorize_age(age):142 if age < 30:143 return 'Young'144 elif age < 50:145 return 'Middle'146 else:147 return 'Senior'148149df['age_category'] = df['age'].apply(categorize_age)150df['salary_log'] = df['salary'].apply(np.log)151152# Exporting data153df.to_csv('output.csv', index=False)154df.to_excel('output.xlsx', sheet_name='Data')155df.to_json('output.json', orient='records')156```157158## Best Practices1591601. **Use vectorized operations**: Avoid loops; pandas operations are optimized for vectorized execution.1611622. **Chain operations for readability**: Use method chaining with `assign()`, `pipe()`, and successive operations.1631643. **Specify dtypes explicitly**: When loading data, specify column types to avoid inference overhead.1651664. **Use appropriate index**: Set meaningful indices (dates, IDs) for efficient operations.1671685. **Avoid chained indexing**: Use `.loc[]` and `.iloc[]` with tuple indices instead of `df[col][row]`.1691706. **Memory optimization**: Use `category` dtype for low-cardinality strings, `downcast` for numeric types.1711727. **Use appropriate file formats**: Parquet for speed and compression, CSV for interoperability.1731748. **Handle SettingWithCopy warnings**: Understand pandas copy/view semantics and use `.copy()` when needed.175176## Common Patterns177178### Pattern 1: Exploratory Data Analysis Pipeline179```python180def eda_pipeline(df):181 # Basic info182 info = {183 'shape': df.shape,184 'dtypes': df.dtypes,185 'missing': df.isnull().sum(),186 'describe': df.describe()187 }188 189 # Categorical analysis190 cat_cols = df.select_dtypes(include=['object']).columns191 cat_summary = {col: {'unique': df[col].nunique(), 192 'top': df[col].value_counts().head()} 193 for col in cat_cols}194 195 # Numerical analysis196 num_cols = df.select_dtypes(include=[np.number]).columns197 num_summary = df[num_cols].corr()198 199 return info, cat_summary, num_summary200```201202### Pattern 2: Data Cleaning Pipeline203```python204def clean_data(df):205 # Remove duplicates206 df = df.drop_duplicates()207 208 # Handle missing values209 numeric_cols = df.select_dtypes(include=[np.number]).columns210 categorical_cols = df.select_dtypes(include=['object']).columns211 212 df[numeric_cols] = df[numeric_cols].fillna(df[numeric_cols].median())213 df[categorical_cols] = df[categorical_cols].fillna(df[categorical_cols].mode().iloc[0])214 215 # Remove outliers (IQR method)216 for col in numeric_cols:217 Q1 = df[col].quantile(0.25)218 Q3 = df[col].quantile(0.75)219 IQR = Q3 - Q1220 df = df[(df[col] >= Q1 - 1.5*IQR) & (df[col] <= Q3 + 1.5*IQR)]221 222 # Standardize text223 for col in categorical_cols:224 df[col] = df[col].str.strip().str.lower()225 226 return df227```228229### Pattern 3: Feature Engineering from Raw Data230```python231def engineer_features(df):232 # Create features233 df = df.assign(234 age_group=lambda x: pd.cut(x['age'], bins=[0, 25, 35, 50, 100],235 labels=['young', 'adult', 'middle', 'senior']),236 salary_per_year_exp=lambda x: x['salary'] / (x['years_exp'] + 1),237 is_senior=lambda x: (x['age'] > 40).astype(int)238 )239 240 # One-hot encoding241 df = pd.get_dummies(df, columns=['department', 'gender'], drop_first=True)242 243 # Interaction features244 df['exp_salary_product'] = df['years_exp'] * df['salary']245 246 return df247```