最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pandas?DataFrame數(shù)據(jù)合并與連接的完整指南

 更新時間:2026年02月24日 08:28:30   作者:detayun  
在數(shù)據(jù)分析工作中,我們經(jīng)常需要處理來自多個來源的數(shù)據(jù),將這些分散的數(shù)據(jù)集整合成一個統(tǒng)一的結(jié)構(gòu)是分析前的關(guān)鍵步驟,本文將系統(tǒng)介紹Pandas中DataFrame合并與連接的核心技術(shù),幫助你掌握數(shù)據(jù)整合的藝術(shù),需要的朋友可以參考下

引言

在數(shù)據(jù)分析工作中,我們經(jīng)常需要處理來自多個來源的數(shù)據(jù)。將這些分散的數(shù)據(jù)集整合成一個統(tǒng)一的結(jié)構(gòu)是分析前的關(guān)鍵步驟。Pandas庫提供了多種強(qiáng)大的數(shù)據(jù)合并與連接方法,能夠高效處理各種數(shù)據(jù)整合場景。本文將系統(tǒng)介紹Pandas中DataFrame合并與連接的核心技術(shù),幫助你掌握數(shù)據(jù)整合的藝術(shù)。

一、合并基礎(chǔ):concat()方法

1.1 基本縱向合并(堆疊)

concat()是最基礎(chǔ)的數(shù)據(jù)合并方法,默認(rèn)沿軸0(行方向)合并:

import pandas as pd

# 創(chuàng)建示例DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})

# 縱向合并(堆疊)
result = pd.concat([df1, df2], axis=0)
print(result)

1.2 基本橫向合并(并排)

設(shè)置axis=1可實現(xiàn)橫向合并:

df3 = pd.DataFrame({'C': ['C0', 'C1']})
df4 = pd.DataFrame({'D': ['D0', 'D1']})

# 橫向合并
result = pd.concat([df3, df4], axis=1)
print(result)

1.3 處理索引問題

合并后常出現(xiàn)重復(fù)索引,可通過以下參數(shù)控制:

# 忽略原索引,創(chuàng)建新數(shù)字索引
result = pd.concat([df1, df2], ignore_index=True)

# 保留原索引并添加多級索引
result = pd.concat([df1, df2], keys=['df1', 'df2'])
print(result)

二、數(shù)據(jù)庫風(fēng)格的連接:merge()方法

2.1 基本內(nèi)連接(INNER JOIN)

merge()是Pandas中最強(qiáng)大的連接方法,類似于SQL中的JOIN操作:

# 創(chuàng)建示例DataFrame
left = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 'A': ['A0', 'A1', 'A2']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K3'], 'B': ['B0', 'B1', 'B2']})

# 內(nèi)連接(默認(rèn))
result = pd.merge(left, right, on='key')
print(result)

2.2 不同連接類型

Pandas支持所有標(biāo)準(zhǔn)SQL連接類型:

# 左連接(保留左表所有記錄)
left_join = pd.merge(left, right, on='key', how='left')

# 右連接(保留右表所有記錄)
right_join = pd.merge(left, right, on='key', how='right')

# 外連接(保留所有記錄)
outer_join = pd.merge(left, right, on='key', how='outer')

2.3 多鍵連接

可以基于多個列進(jìn)行連接:

left_multi = pd.DataFrame({
    'key1': ['K0', 'K0', 'K1'],
    'key2': ['K0', 'K1', 'K0'],
    'A': ['A0', 'A1', 'A2']
})

right_multi = pd.DataFrame({
    'key1': ['K0', 'K1'],
    'key2': ['K0', 'K0'],
    'B': ['B0', 'B1']
})

result = pd.merge(left_multi, right_multi, on=['key1', 'key2'])

2.4 處理列名沖突

當(dāng)連接列名相同時,Pandas會自動添加后綴:

# 自定義后綴
result = pd.merge(left, right, on='key', suffixes=('_left', '_right'))

三、基于索引的連接:join()方法

3.1 基本索引連接

join()merge()的簡化版,專門用于基于索引的連接:

# 創(chuàng)建示例DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1']}, index=['K0', 'K1'])
df2 = pd.DataFrame({'B': ['B0', 'B1']}, index=['K0', 'K2'])

# 左連接(默認(rèn))
result = df1.join(df2, how='left')
print(result)

3.2 多DataFrame連接

可以一次性連接多個DataFrame:

df3 = pd.DataFrame({'C': ['C0', 'C1']}, index=['K0', 'K2'])
result = df1.join([df2, df3], how='outer')

四、高級合并技巧

4.1 合并時添加指示器列

可以添加一列顯示記錄來源:

result = pd.merge(left, right, on='key', how='outer', indicator=True)
print(result)

4.2 合并不同數(shù)據(jù)類型

Pandas會自動對齊數(shù)據(jù)類型,但有時需要手動轉(zhuǎn)換:

left['key'] = left['key'].astype(str)  # 轉(zhuǎn)換為字符串類型
right['key'] = right['key'].astype(str)
result = pd.merge(left, right, on='key')

4.3 合并時更新值

使用update()方法用右表更新左表中的值:

df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6]}, index=[0, 1])

df1.update(df2)  # 只更新匹配的行和列
print(df1)

4.4 合并時應(yīng)用函數(shù)

可以在合并時對重疊列應(yīng)用函數(shù):

from pandas.api.types import CategoricalDtype

# 自定義合并函數(shù)
def merge_with_func(left, right):
    return left + '_' + right  # 示例:字符串連接

# 創(chuàng)建示例
df1 = pd.DataFrame({'key': ['K0', 'K1'], 'val': ['A', 'B']})
df2 = pd.DataFrame({'key': ['K0', 'K1'], 'val': ['1', '2']})

# 先合并再應(yīng)用函數(shù)(實際中可能需要更復(fù)雜的處理)
result = pd.merge(df1, df2, on='key')
result['combined'] = result['val_x'] + '_' + result['val_y']

五、性能優(yōu)化技巧

5.1 使用category類型優(yōu)化合并

對于低基數(shù)列,轉(zhuǎn)換為category類型可以提高合并速度:

df1['key'] = df1['key'].astype('category')
df2['key'] = df2['key'].astype('category')

5.2 預(yù)先排序提高合并效率

對連接鍵預(yù)先排序可以顯著提高大數(shù)據(jù)集的合并速度:

df1 = df1.sort_values('key')
df2 = df2.sort_values('key')

5.3 使用Dask處理超大數(shù)據(jù)集

對于超出內(nèi)存的數(shù)據(jù)集,可以使用Dask庫:

import dask.dataframe as dd

ddf1 = dd.from_pandas(df1, npartitions=2)
ddf2 = dd.from_pandas(df2, npartitions=2)
result = dd.merge(ddf1, ddf2, on='key').compute()

六、實際應(yīng)用案例

案例1:整合銷售數(shù)據(jù)

# 訂單數(shù)據(jù)
orders = pd.DataFrame({
    'order_id': [1, 2, 3],
    'customer_id': [101, 102, 103],
    'amount': [100, 200, 150]
})

# 客戶數(shù)據(jù)
customers = pd.DataFrame({
    'customer_id': [101, 102, 104],
    'name': ['Alice', 'Bob', 'Charlie'],
    'segment': ['A', 'B', 'C']
})

# 左連接獲取完整訂單信息(包括未匹配的客戶)
order_details = pd.merge(
    orders, 
    customers, 
    on='customer_id', 
    how='left'
)
print(order_details)

案例2:時間序列數(shù)據(jù)對齊

# 創(chuàng)建兩個時間序列數(shù)據(jù)集(時間不完全對齊)
dates1 = pd.date_range('2023-01-01', periods=5)
dates2 = pd.date_range('2023-01-03', periods=5)

df_temp = pd.DataFrame({'date': dates1, 'temp': [20, 21, 22, 23, 24]})
df_rain = pd.DataFrame({'date': dates2, 'rain': [0.1, 0.2, 0.0, 0.3, 0.1]})

# 外連接并對齊日期
weather_data = pd.merge(
    df_temp, 
    df_rain, 
    on='date', 
    how='outer'
).sort_values('date')
print(weather_data)

案例3:多源數(shù)據(jù)整合

# 員工基本信息
employees = pd.DataFrame({
    'emp_id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie'],
    'dept': ['HR', 'IT', 'Finance']
})

# 薪資數(shù)據(jù)
salaries = pd.DataFrame({
    'emp_id': [1, 2, 4],  # 注意有員工4不在基本信息中
    'salary': [50000, 80000, 70000]
})

# 部門信息
departments = pd.DataFrame({
    'dept': ['HR', 'IT', 'Finance'],
    'location': ['Building A', 'Building B', 'Building C']
})

# 多步合并:先合并員工和薪資,再合并部門信息
step1 = pd.merge(employees, salaries, on='emp_id', how='outer')
result = pd.merge(step1, departments, on='dept', how='left')
print(result)

七、常見問題解決

問題1:合并后出現(xiàn)重復(fù)列

# 使用suffixes參數(shù)處理
result = pd.merge(df1, df2, on='key', suffixes=('_left', '_right'))

問題2:合并后數(shù)據(jù)量異常

檢查連接類型是否正確:

# 確認(rèn)連接類型
print(f"左表行數(shù): {len(left)}")
print(f"右表行數(shù): {len(right)}")
print(f"內(nèi)連接結(jié)果: {len(pd.merge(left, right, on='key', how='inner'))}")

問題3:合并時數(shù)據(jù)類型不匹配

# 檢查并轉(zhuǎn)換數(shù)據(jù)類型
print(left['key'].dtype)
print(right['key'].dtype)

# 統(tǒng)一轉(zhuǎn)換為字符串
left['key'] = left['key'].astype(str)
right['key'] = right['key'].astype(str)

問題4:處理大型合并時的內(nèi)存問題

# 分塊處理大型合并
chunk_size = 100000
results = []

for i in range(0, len(df1), chunk_size):
    chunk = pd.merge(
        df1.iloc[i:i+chunk_size],
        df2,
        on='key'
    )
    results.append(chunk)

final_result = pd.concat(results, ignore_index=True)

總結(jié)

DataFrame的合并與連接是數(shù)據(jù)分析中不可或缺的技能,掌握它們可以讓你:

  1. 高效整合來自不同來源的數(shù)據(jù)
  2. 構(gòu)建適合分析的完整數(shù)據(jù)集
  3. 處理數(shù)據(jù)對齊和匹配問題
  4. 優(yōu)化大數(shù)據(jù)集的處理性能

本文介紹了從基礎(chǔ)到高級的合并連接技術(shù),包括concat()、merge()join()等核心方法,以及各種實際應(yīng)用場景和性能優(yōu)化技巧。記住,選擇哪種合并方法取決于你的具體需求:

  • 需要簡單堆疊數(shù)據(jù)?使用concat()
  • 需要基于鍵的復(fù)雜連接?使用merge()
  • 需要基于索引的快速連接?使用join()

通過實踐這些技術(shù),你將能夠輕松應(yīng)對各種數(shù)據(jù)整合挑戰(zhàn),為后續(xù)的數(shù)據(jù)分析和可視化奠定堅實基礎(chǔ)。

以上就是Pandas DataFrame數(shù)據(jù)合并與連接的完整指南的詳細(xì)內(nèi)容,更多關(guān)于Pandas DataFrame數(shù)據(jù)合并與連接的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳細(xì)過程帶你用Python做車牌自動識別系統(tǒng)

    詳細(xì)過程帶你用Python做車牌自動識別系統(tǒng)

    這篇文章主要介紹了帶你用Python做車牌自動識別系統(tǒng)的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Python如何向IP地址發(fā)送字符串

    Python如何向IP地址發(fā)送字符串

    在Python中,向IP地址發(fā)送字符串通常意味著你需要通過某種協(xié)議來實現(xiàn)通信,最常見的協(xié)議包括TCP和UDP,這篇文章主要介紹了Python向IP地址發(fā)送字符串的示例代碼,需要的朋友可以參考下
    2024-08-08
  • Python實現(xiàn)八皇后問題示例代碼

    Python實現(xiàn)八皇后問題示例代碼

    這篇文章主要給大家介紹了關(guān)于利用Python實現(xiàn)八皇后問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Python cookie的保存與讀取、SSL講解

    Python cookie的保存與讀取、SSL講解

    在本篇文章里小編給大家整理了關(guān)于Python cookie的保存與讀取、SSL講解,需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Python面向?qū)ο笕筇卣鳎豪^承、封裝和多態(tài)的深度解析

    Python面向?qū)ο笕筇卣鳎豪^承、封裝和多態(tài)的深度解析

    在面向?qū)ο蟪绦蛟O(shè)計中,對象可以看做是數(shù)據(jù)(特性)以及由一系列可以存取、操作這些數(shù)據(jù)的方法所組成的集合,Python是面向?qū)ο蟮恼Z言,支持面向?qū)ο缶幊痰娜筇匦裕豪^承、封裝(隱藏)、多態(tài),本文將逐一講解Python的三大特性
    2025-01-01
  • python實現(xiàn)多個視頻文件合成畫中畫效果

    python實現(xiàn)多個視頻文件合成畫中畫效果

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)多個視頻文件合成畫中畫效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • pycharm如何關(guān)閉pytest

    pycharm如何關(guān)閉pytest

    這篇文章主要介紹了pycharm如何關(guān)閉pytest問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • python實現(xiàn)查找兩個字符串中相同字符并輸出的方法

    python實現(xiàn)查找兩個字符串中相同字符并輸出的方法

    這篇文章主要介紹了python實現(xiàn)查找兩個字符串中相同字符并輸出的方法,涉及Python針對字符串操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問題

    解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問題

    這篇文章主要介紹了解決pytorch 交叉熵?fù)p失輸出為負(fù)數(shù)的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Django 多表關(guān)聯(lián) 存儲 使用方法詳解 ManyToManyField save

    Django 多表關(guān)聯(lián) 存儲 使用方法詳解 ManyToManyField save

    今天小編就為大家分享一篇Django 多表關(guān)聯(lián) 存儲 使用方法詳解 ManyToManyField save,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

平江县| 乳源| 乌鲁木齐市| 科技| 灵武市| 原阳县| 海原县| 延庆县| 宜兰县| 重庆市| 修水县| 水富县| 永新县| 离岛区| 武义县| 疏勒县| 靖江市| 郁南县| 乌鲁木齐县| 庆城县| 鄂托克前旗| 孟连| 九台市| 兴城市| 肥东县| 合江县| 长治市| 行唐县| 三江| 瑞安市| 拉萨市| 三台县| 泰宁县| 扶风县| 治县。| 冷水江市| 滨州市| 抚州市| 岳阳县| 武隆县| 庆元县|