Pandas dataframes for everyday life

Lesson#3 of 9 in project Theory

Creating a DataFrame

import pandas as pd
df = pd.DataFrame({
    "name": ["Alice", "Bob", "Eve"],
    "age":  [25, 30, 22],
    "score": [88.5, 91.0, 76.3]
})

Loading from CSV

df = pd.read_csv("data.csv")
df.to_csv("out.csv", index=False)

Inspecting

df.head()       # first 5 rows
df.tail(3)      # last 3
df.info()       # types, nulls
df.describe()   # stats summary
df.shape        # (rows, cols)
df.columns      # column names

Selecting columns

df["age"]                  # single → Series
df[["name", "score"]]      # multiple → DataFrame

Filtering rows

df[df["age"] > 24]
df[(df["age"] > 22) & (df["score"] > 80)]
df[df["name"].isin(["Alice", "Eve"])]
df.query("age > 24 and score > 80")

loc vs iloc

df.loc[0, "name"]         # by label
df.loc[df["age"] > 24]    # by condition
df.iloc[0]                # by position
df.iloc[1:3, 0:2]         # slice

Cleaning

df.isnull().sum()                        # count nulls
df.dropna()                              # drop null rows
df["age"].fillna(df["age"].mean())       # fill with mean
df.drop_duplicates(subset=["name"])      # remove dupes
df["age"] = df["age"].astype(float)      # cast type
df.rename(columns={"score": "points"})  # rename

Grouping & aggregating

df.groupby("name")["score"].mean()
df.groupby("name").agg(
    avg_score=("score", "mean"),
    max_age=("age", "max")
)

Sorting

df.sort_values("score", ascending=False)
df.sort_values(["age", "score"], ascending=[True, False])

Joining

pd.merge(left, right, on="id")              # inner join
pd.merge(left, right, on="id", how="left")  # left join

My own example

Click-to-copy showcase of how things work in pandas:

import pandas as pd
import numpy as np


def main():
    print("1. Creating DataFrames")
    data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35], 'score': [85.5, 90.0, 78.5]}
    df = pd.DataFrame(data)
    print("  from dict:")
    print(df)

    df2 = pd.DataFrame(np.random.randn(3, 2), columns=['col1', 'col2'])
    print("\n  from numpy array:")
    print(df2)

    print("\n2. DataFrame info")
    print("  shape:", df.shape)
    print("  dtypes:")
    print(df.dtypes)
    print("  columns:", df.columns.tolist())
    print("  index:", df.index.tolist())

    print("\n3. Selecting data")
    print("  single column:")
    print(df['name'])
    print("  multiple columns:")
    print(df[['name', 'age']])
    print("  first row:")
    print(df.iloc[0])
    print("  rows 0-1:")
    print(df.iloc[0:2])

    print("\n4. Boolean filtering")
    mask = df['age'] > 25
    print("  age > 25:")
    print(df[mask])
    print("  age > 25 AND score > 80:")
    print(df[(df['age'] > 25) & (df['score'] > 80)])

    print("\n5. Adding/modifying columns")
    df['age_group'] = df['age'].apply(lambda x: 'young' if x < 30 else 'old')
    print("  with new column:")
    print(df)

    print("\n6. Aggregation and grouping")
    print("  mean of numeric columns:")
    print(df.mean(numeric_only=True))
    print("  group by age_group:")
    grouped = df.groupby('age_group')[['age', 'score']].mean()
    print(grouped)

    print("\n7. Sorting")
    print("  sort by age:")
    print(df.sort_values('age'))
    print("  sort by score descending:")
    print(df.sort_values('score', ascending=False))

    print("\n8. Handling missing data")
    df_with_nan = pd.DataFrame({
        'A': [1, 2, np.nan, 4],
        'B': [5, np.nan, 7, 8]
    })
    print("  with NaN:")
    print(df_with_nan)
    print("  dropna():")
    print(df_with_nan.dropna())
    print("  fillna(0):")
    print(df_with_nan.fillna(0))

    print("\n9. Merging/joining")
    df_a = pd.DataFrame({'key': [1, 2, 3], 'val_a': ['a', 'b', 'c']})
    df_b = pd.DataFrame({'key': [1, 2, 4], 'val_b': ['x', 'y', 'z']})
    print("  merge on key:")
    merged = pd.merge(df_a, df_b, on='key', how='inner')
    print(merged)

    print("\n10. Pivot table")
    data_pivot = {
        'product': ['A', 'A', 'B', 'B', 'A', 'B'],
        'region': ['East', 'West', 'East', 'West', 'East', 'West'],
        'sales': [100, 150, 200, 180, 120, 220]
    }
    df_pivot = pd.DataFrame(data_pivot)
    print("  original:")
    print(df_pivot)
    pivot = df_pivot.pivot_table(values='sales', index='product', columns='region', aggfunc='sum')
    print("  pivoted:")
    print(pivot)

    print("\n11. Value counts")
    print("  value_counts():")
    print(df_with_nan['A'].value_counts())

    print("\n12. Basic statistics")
    print("  describe():")
    print(df[['age', 'score']].describe())

    print("\n13. Saving and loading")
    csv_path = "tmp_pandas_example.csv"
    df.to_csv(csv_path, index=False)
    print(f"  saved to {csv_path}")
    loaded_df = pd.read_csv(csv_path)
    print("  loaded back:")
    print(loaded_df)


if __name__ == "__main__":
    main()