利用 Pandas 實現數據合并的九個常用函數
一、Pandas數據合并基礎
在數據分析中,數據合并是常見的需求。Pandas 提供了多種方法幫助我們高效完成這項任務!簡單來說,數據合并就像拼圖一樣,把不同的數據塊組合成一個完整的畫面。
1. 數據合并的核心概念
Pandas 的數據合并主要分為 堆疊** 和 鍵連接 兩種方式。堆疊是將數據上下或左右拼接,而鍵連接則是通過共同的列或索引進行匹配。
示例代碼:
import pandas as pd
# 創建兩個簡單的 DataFrame
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
print("第一個 DataFrame:")
print(df1)
print("\n第二個 DataFrame:")
print(df2)
輸出結果:
第一個 DataFrame:
A B
0 1 3
1 2 4
第二個 DataFrame:
A B
0 5 7
1 6 8
接下來的章節會詳細講解如何用不同函數實現這些操作!別急,咱們一步步來~
二、使用concat函數進行簡單數據堆疊
1. concat函數的基礎用法
Pandas 的 concat 函數可以輕松實現數據的堆疊操作。比如,你想把兩個表格上下或左右合并,concat 就能派上用場!來看個例子:
import pandas as pd
# 創建兩個簡單的 DataFrame
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
# 使用 concat 堆疊數據(默認按行堆疊)
result = pd.concat([df1, df2])
print(result)
輸出結果:
A B
0 1 3
1 2 4
0 5 7
1 6 8
這里,pd.concat([df1, df2]) 把兩個表格按照行堆疊在一起,默認保留索引。如果想重置索引,可以加上參數 ignore_index=True。是不是超簡單?試試看吧!
三、利用append方法追加數據
1. append方法簡介
Pandas中的append方法可以輕松地將一個DataFrame追加到另一個DataFrame的末尾。這個方法特別適合處理小規模數據追加任務!不過需要注意,append在2023年后已被標記為過時,推薦使用pandas.concat替代。但為了了解歷史用法,我們還是來學習一下吧!
來看個例子:
import pandas as pd
# 創建兩個DataFrame
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
# 使用append方法
result = df1.append(df2, ignore_index=True) # ignore_index=True重新生成索引
print(result)
輸出結果:
A B
0 1 3
1 2 4
2 5 7
3 6 8
2. 注意事項
- append不會修改原DataFrame,而是返回一個新的合并后的DataFrame。
- 如果列名不一致,缺失值會以NaN填充。
- 推薦在新項目中盡量使用concat代替append,因為它更靈活且性能更好!
四、merge函數實現基于鍵的合并
1. 使用 merge 函數完成基于鍵的數據合并
Pandas 的 merge 函數可以像數據庫一樣,根據指定的鍵將兩個數據集合并在一起。它支持內連接、外連接、左連接和右連接,非常靈活!下面看一個例子:
import pandas as pd
# 創建兩個示例 DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['B', 'C', 'D'], 'value2': [4, 5, 6]})
# 使用 merge 函數進行內連接
merged_df = pd.merge(df1, df2, on='key', how='inner')
print(merged_df)
輸出結果:
key value1 value2
0 B 2 4
1 C 3 5
這段代碼中,on='key' 表示以 key 列為合并依據,how='inner' 表示只保留兩個表中共有的鍵值。是不是很直觀?你可以嘗試更換 how 參數,比如 'outer' 或 'left',看看會發生什么變化!
五、join方法完成索引對齊的合并
1. 什么是join方法?
join 是 Pandas 中一個非常實用的方法,它可以根據索引自動對齊數據進行合并。簡單來說,就是把兩個表格按照它們的“行標簽”(索引)拼在一起。
舉個例子:假設有兩個表格,一個是學生的成績表,另一個是學生的個人信息表。如果它們都有相同的學號作為索引,用 join 就能輕松合并!
import pandas as pd
# 創建兩個示例 DataFrame
df1 = pd.DataFrame({'Score': [80, 90, 70]}, index=['Alice', 'Bob', 'Charlie'])
df2 = pd.DataFrame({'Age': [20, 22, 21]}, index=['Alice', 'Bob', 'Charlie'])
# 使用 join 方法合并
result = df1.join(df2)
print(result)
輸出結果:
Score Age
Alice 80 20
Bob 90 22
Charlie 70 21
2. 為什么用 join?
相比其他方法,join 更加簡潔明了,特別適合以索引為基準的合并場景。此外,它還支持多種參數設置,比如選擇 inner 或 outer 合并方式,靈活又強大!試試看吧,你會愛上它的!
六、update函數更新數據值
1. 使用 update 函數更新數據值
Pandas 的 update 函數可以用來更新一個 DataFrame 中的值,用另一個 DataFrame 的值進行替換。如果目標 DataFrame 中有缺失值,可以用這個方法輕松填補!來看個例子:
import pandas as pd
# 創建兩個 DataFrame
df1 = pd.DataFrame({'A': [1, 2, None], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'A': [7, 8, 9], 'B': [10, 11, 12]})
print("原始數據 df1:")
print(df1)
# 使用 update 更新 df1
df1.update(df2)
print("\n更新后的 df1:")
print(df1)
輸出結果:
原始數據 df1:
A B
0 1.0 4
1 2.0 5
2 NaN 6
更新后的 df1:
A B
0 7.0 4
1 8.0 5
2 9.0 6
代碼解析:
- df1.update(df2) 會將 df2 中的值覆蓋到 df1 中,但只更新那些非空的值。
- 如果 df1 中有缺失值(如 NaN),它會被 df2 中對應的值替換。
- 這個方法非常適合處理需要動態更新的數據集!
七、combine_first處理缺失值的合并
1. 使用 combine_first 處理缺失值
在數據分析中,經常會遇到兩個數據集有部分重疊但某些值缺失的情況。Pandas 提供了 combine_first 方法,可以用來填補這些缺失值!簡單來說,它會用另一個 DataFrame 的值來填充當前 DataFrame 中的缺失值(NaN)。
舉個例子:
import pandas as pd
# 創建兩個帶有缺失值的 DataFrame
df1 = pd.DataFrame({'A': [1, None, 3], 'B': [None, 5, 6]})
df2 = pd.DataFrame({'A': [7, 8, 9], 'B': [10, None, 12]})
# 使用 combine_first 填補缺失值
result = df1.combine_first(df2)
print("原始 DataFrame 1:\n", df1)
print("原始 DataFrame 2:\n", df2)
print("合并結果:\n", result)
輸出結果:
原始 DataFrame 1:
A B
0 1.0 NaN
1 NaN 5.0
2 3.0 6.0
原始 DataFrame 2:
A B
0 7.0 10.0
1 8.0 NaN
2 9.0 12.0
合并結果:
A B
0 1.0 10.0
1 8.0 5.0
2 3.0 6.0
解釋:
- 如果 df1 中某個值是 NaN,combine_first 會從 df2 中取對應位置的值進行填補。
- 如果 df1 中已經有值,則保留原值,不會被覆蓋。
- 這個方法特別適合處理有部分重疊的數據集,幫你輕松搞定缺失值問題!
八、高級技巧:指示器與覆蓋選項的應用
在數據合并中,高級選項如 indicator 和 overwrite 能讓合并更加靈活和清晰。下面我們來詳細講解!
1. 使用 indicator 參數標記合并來源
indicator 參數會在合并后的數據框中添加一列,標明每行數據來自哪個表。非常實用!看例子:
import pandas as pd
# 創建兩個示例數據框
df1 = pd.DataFrame({'key': ['A', 'B'], 'data1': [10, 20]})
df2 = pd.DataFrame({'key': ['B', 'C'], 'data2': [30, 40]})
# 合并并啟用 indicator
merged = pd.merge(df1, df2, on='key', how='outer', indicator=True)
print(merged)
輸出:
key data1 data2 _merge
0 A 10.0 NaN left_only
1 B 20.0 30.0 both
2 C NaN 40.0 right_only
通過 _merge 列,我們可以清楚地知道每行數據的來源。
2. 使用 overwrite 參數控制值覆蓋
update 方法中的 overwrite 參數可以決定是否用新值替換舊值。例如:
# 創建兩個數據框
df_old = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df_new = pd.DataFrame({'A': [10, 20, 30], 'B': [None, None, None]}, index=[0, 1, 3])
# 使用 update 更新數據,且不覆蓋空值
df_old.update(df_new, overwrite=False)
print(df_old)
輸出:
A B
0 10.0 4.0
1 20.0 5.0
2 3.0 6.0
這里,overwrite=False 確保了空值不會覆蓋原有值。
這些高級技巧能讓數據合并更精準、更高效!快試試吧!
九、實戰案例:多源銷售數據分析與整合
1. 銷售數據的初步加載與檢查
在實際工作中,我們經常需要處理來自不同來源的銷售數據。Pandas 是完成這項任務的理想工具!首先,我們需要加載數據并進行初步檢查。
import pandas as pd
# 加載兩個銷售數據表
sales1 = pd.read_csv("sales_data_1.csv")
sales2 = pd.read_csv("sales_data_2.csv")
# 查看數據結構
print(sales1.head())
print(sales2.head())
這段代碼會幫助你快速了解數據的基本情況。
2. 使用 concat 堆疊多源數據
如果多個銷售數據表具有相同的列結構,可以直接用 concat 將它們堆疊在一起。
combined_sales = pd.concat([sales1, sales2], ignore_index=True)
print(combined_sales.head())
ignore_index=True 參數會讓新數據表重新生成索引,避免混亂。
3. 基于鍵的合并 (merge)
當數據表之間存在關聯字段(如“產品ID”或“日期”)時,可以用 merge 函數將它們連接起來。
# 假設 sales1 和 product_details 都有 "product_id" 列
product_details = pd.read_csv("product_details.csv")
merged_data = pd.merge(sales1, product_details, on="product_id", how="left")
print(merged_data.head())
這里我們使用了 how="left",表示以左側數據表為主,保留所有左側記錄。
4. 索引對齊的合并 (join)
如果數據表是以索引為基礎的,可以使用 join 方法。
# 假設 sales1 的索引是日期,而 customer_info 的索引也是日期
customer_info = pd.read_csv("customer_info.csv", index_col="date")
joined_data = sales1.join(customer_info, how="inner")
print(joined_data.head())
how="inner" 表示只保留兩個表中都有的日期記錄。
5. 更新數據值 (update)
當我們需要更新部分數據時,update 是一個高效的選擇。
# 假設 updated_prices 包含最新的價格信息
updated_prices = pd.DataFrame({"product_id": [1, 2], "price": [100, 200]})
sales1.set_index("product_id", inplace=True)
sales1.update(updated_prices.set_index("product_id"))
print(sales1.reset_index())
通過設置索引,我們可以精準地更新對應記錄。
6. 處理缺失值的合并 (combine_first)
當兩個數據表存在部分重疊但有缺失值時,combine_first 可以派上用場。
# 假設 sales1 和 sales2 都有部分缺失值
filled_data = sales1.combine_first(sales2)
print(filled_data.head())
它會優先保留 sales1 的值,只有在缺失時才會從 sales2 中補充。
7. 指示器與覆蓋選項的應用
高級合并中,指示器和覆蓋選項可以幫助我們更好地控制合并過程。
# 添加指示器,查看每條記錄來自哪個表
merged_with_indicator = pd.merge(sales1, sales2, on="product_id", how="outer", indicator=True)
print(merged_with_indicator["_merge"].value_counts())
# 設置覆蓋選項,避免重復列名沖突
merged_no_duplicates = pd.merge(sales1, sales2, on="product_id", suffixes=("_sales1", "_sales2"))
print(merged_no_duplicates.head())
這些技巧讓合并結果更加清晰明了。
通過以上步驟,你可以輕松完成多源銷售數據的整合與分析!