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