Altcademy - a Forbes magazine logo Best Coding Bootcamp 2023

How to combine two dataframes in Pandas

Understanding DataFrames in Pandas

Before we dive into the process of combining two DataFrames, let's first understand what a DataFrame is. In Pandas, a DataFrame is a two-dimensional, size-mutable, and potentially heterogeneous tabular data structure with labeled axes (rows and columns). Think of it as a table in a spreadsheet or a SQL database. Each column in a DataFrame can be of a different data type, and the rows and columns are identified with labels rather than simple integer indices.

Preparing Your Environment

To work with Pandas and combine DataFrames, you'll need to have Python and Pandas installed on your computer. You can install Pandas using pip, a package manager for Python:

pip install pandas

Once installed, you can import Pandas in your Python script or Jupyter notebook with the following line:

import pandas as pd

We use pd as an alias for Pandas, which is a common convention and saves us from typing pandas every time we need to access a function from the Pandas library.

Creating Simple DataFrames

Let's create two simple DataFrames to work with. These DataFrames could represent anything such as sales data, student grades, or even sports statistics. For our example, we'll create DataFrames that represent information about fruits and their prices in two different stores.

# Create the first DataFrame
data1 = {
    'Fruit': ['Apple', 'Banana', 'Cherry'],
    'Price_Store_1': [1.20, 0.80, 2.00]
}
df1 = pd.DataFrame(data1)

# Create the second DataFrame
data2 = {
    'Fruit': ['Apple', 'Banana', 'Cherry'],
    'Price_Store_2': [1.00, 0.75, 2.20]
}
df2 = pd.DataFrame(data2)

Combining DataFrames: Concatenation

One way to combine DataFrames is through concatenation. Concatenation is like stacking books on top of each other or appending one list to another. In Pandas, you can concatenate DataFrames vertically (adding rows) or horizontally (adding columns).

Vertical Concatenation

If we have two sets of data that share the same columns but represent different rows (like two days of sales data), we can stack them on top of each other.

# Vertical concatenation
vertical_combined = pd.concat([df1, df2], axis=0)

Here, axis=0 tells Pandas to stack the DataFrames vertically. However, in our case, this doesn't make much sense because df1 and df2 represent prices from different stores, not additional entries of fruits.

Horizontal Concatenation

Horizontal concatenation is more like placing two puzzles side by side, where each puzzle represents a DataFrame.

# Horizontal concatenation
horizontal_combined = pd.concat([df1, df2], axis=1)

With axis=1, Pandas knows we want to add columns from df2 to df1. But you'll notice a problem: we end up with two 'Fruit' columns, which is redundant.

Combining DataFrames: Merge

To combine DataFrames more intelligently, we can use the merge function. Merging is like creating a partnership where the two DataFrames are joined based on a common key or keys.

Inner Merge

An inner merge is like finding common friends in two separate friend lists. It returns only the entries that are present in both DataFrames.

# Inner merge
inner_merged = pd.merge(df1, df2, on='Fruit')

The on parameter specifies the common column that Pandas will use to combine the DataFrames. In this case, only the rows with fruits found in both DataFrames are included in the result.

Outer Merge

An outer merge is like creating a big party list from two separate friend lists, inviting everyone even if they only appear on one list.

# Outer merge
outer_merged = pd.merge(df1, df2, on='Fruit', how='outer')

By setting how='outer', we tell Pandas to include all rows from both DataFrames, filling in any missing values with NaN (which stands for "Not a Number" and is used to denote missing data).

Left and Right Merge

A left merge is like saying, "I want all my friends and only the common friends from your list," while a right merge is the opposite.

# Left merge
left_merged = pd.merge(df1, df2, on='Fruit', how='left')

# Right merge
right_merged = pd.merge(df1, df2, on='Fruit', how='right')

With how='left', we keep all rows from the left DataFrame (df1) and only the common rows from the right DataFrame (df2). The roles are reversed for a right merge.

Joining DataFrames

Joining is a concept similar to merging but uses indices to combine DataFrames. It's like matching puzzle pieces based on where they fit rather than the picture they display.

# Set 'Fruit' as the index for both DataFrames
df1_indexed = df1.set_index('Fruit')
df2_indexed = df2.set_index('Fruit')

# Join the DataFrames
joined = df1_indexed.join(df2_indexed)

By setting the 'Fruit' column as the index for both DataFrames, join combines them based on this shared index.

Handling Duplicate Column Names

If you have duplicate column names after combining DataFrames, you can handle them by renaming the columns before the merge or join, or by using the suffixes parameter.

# Using suffixes
merged_with_suffixes = pd.merge(df1, df2, on='Fruit', suffixes=('_Store_1', '_Store_2'))

The suffixes parameter adds the specified suffixes to the overlapping column names to distinguish between them.

Real-World Example: Sales Data

Now let's consider a real-world example where we have two DataFrames representing sales data for different quarters of the year.

# Sales data for Q1
sales_q1 = {
    'Product': ['Widget', 'Thingamajig', 'Doohickey'],
    'Q1 Sales': [120, 150, 100]
}
df_sales_q1 = pd.DataFrame(sales_q1)

# Sales data for Q2
sales_q2 = {
    'Product': ['Widget', 'Thingamajig', 'Doohickey'],
    'Q2 Sales': [130, 160, 110]
}
df_sales_q2 = pd.DataFrame(sales_q2)

# Combine the sales data
combined_sales = pd.merge(df_sales_q1, df_sales_q2, on='Product')

In this example, we have a clear key, the 'Product' column, that we can use to merge our DataFrames and get a complete view of the sales data for the first half of the year.

Conclusion: The Art of DataFrame Combination

Combining DataFrames in Pandas is a bit like cooking. Just as you select ingredients and decide whether to mix, blend, or layer them to create a dish, you choose the right method to combine your DataFrames based on the context of your data. Whether it's stacking them up with concatenation, finding commonalities with a merge, or aligning them side by side with a join, the goal is to create a meaningful and coherent dataset that serves your analysis purposes.

Remember, the key to successful DataFrame combination lies in understanding your data and selecting the appropriate method to preserve the relationships within it. With the examples and explanations provided, you're now equipped to tackle the challenge of combining DataFrames in your own projects, making your data analysis endeavors as smooth and efficient as a well-oiled machine.