python pandas多數(shù)據(jù)操作的完整指南
1. 引言
在數(shù)據(jù)分析工作中,我們經(jīng)常需要處理多個(gè)數(shù)據(jù)集并將它們以各種方式組合起來。Pandas 提供了多種強(qiáng)大的多數(shù)據(jù)操作方法,包括合并(merge)、連接(join)、連接(concatenate)和比較(compare)等。本文將詳細(xì)介紹這些功能,并通過實(shí)際代碼示例展示如何使用它們。
2. 數(shù)據(jù)合并 (Merge)
2.1 基本合并操作
merge() 是 Pandas 中最常用的數(shù)據(jù)合并方法,類似于 SQL 中的 JOIN 操作。
import pandas as pd
# 創(chuàng)建兩個(gè)示例DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C', 'D'],
'value': [1, 2, 3, 4]})
df2 = pd.DataFrame({'key': ['B', 'D', 'E', 'F'],
'value': [5, 6, 7, 8]})
# 內(nèi)連接(inner join)
result = pd.merge(df1, df2, on='key')
print("Inner Join:\n", result)
輸出:
Inner Join:
key value_x value_y
0 B 2 5
1 D 4 6
解釋:
- on='key' 指定了合并的鍵
- 默認(rèn)是內(nèi)連接(inner join),只保留兩個(gè)DataFrame中都有的鍵
- 自動(dòng)為相同列名添加后綴 _x 和 _y
2.2 不同類型的連接
# 左連接(left join)
result = pd.merge(df1, df2, on='key', how='left')
print("\nLeft Join:\n", result)
# 右連接(right join)
result = pd.merge(df1, df2, on='key', how='right')
print("\nRight Join:\n", result)
# 外連接(full outer join)
result = pd.merge(df1, df2, on='key', how='outer')
print("\nOuter Join:\n", result)
輸出:
Left Join:
key value_x value_y
0 A 1 NaN
1 B 2 5.0
2 C 3 NaN
3 D 4 6.0
Right Join:
key value_x value_y
0 B 2.0 5
1 D 4.0 6
2 E NaN 7
3 F NaN 8Outer Join:
key value_x value_y
0 A 1.0 NaN
1 B 2.0 5.0
2 C 3.0 NaN
3 D 4.0 6.0
4 E NaN 7.0
5 F NaN 8.0
解釋:
- how 參數(shù)控制連接類型:‘left’, ‘right’, ‘outer’, ‘inner’
- 缺失值用 NaN 填充
2.3 多鍵合并
# 創(chuàng)建含有多個(gè)鍵的DataFrame
df3 = pd.DataFrame({'key1': ['A', 'B', 'C', 'D'],
'key2': ['W', 'X', 'Y', 'Z'],
'value': [1, 2, 3, 4]})
df4 = pd.DataFrame({'key1': ['B', 'D', 'E', 'F'],
'key2': ['X', 'Z', 'Y', 'W'],
'value': [5, 6, 7, 8]})
# 多鍵合并
result = pd.merge(df3, df4, on=['key1', 'key2'])
print("\nMulti-key Merge:\n", result)
輸出:
Multi-key Merge:
key1 key2 value_x value_y
0 B X 2 5
1 D Z 4 6
3. 數(shù)據(jù)連接 (Join)
3.1 DataFrame的join方法
join() 是 merge() 的便捷方法,默認(rèn)按索引連接。
# 設(shè)置索引
df1.set_index('key', inplace=True)
df2.set_index('key', inplace=True)
# 使用join連接
result = df1.join(df2, lsuffix='_left', rsuffix='_right')
print("\nJoin on Index:\n", result)
輸出:
Join on Index:
value_left value_right
key
A 1.0 NaN
B 2.0 5.0
C 3.0 NaN
D 4.0 6.0
解釋:
- 默認(rèn)是左連接
- 必須指定 lsuffix 和 rsuffix 來處理列名沖突
- 按索引連接而不是列
3.2 按列連接
# 重置索引
df1.reset_index(inplace=True)
df2.reset_index(inplace=True)
# 按列連接
result = df1.set_index('key').join(df2.set_index('key'), how='outer', lsuffix='_left', rsuffix='_right')
print("\nJoin on Column:\n", result)
4. 數(shù)據(jù)連接 (Concatenate)
4.1 基本連接操作
concat() 用于沿特定軸連接多個(gè)DataFrame或Series。
# 創(chuàng)建示例DataFrame
df5 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
'B': ['B0', 'B1', 'B2']},
index=[0, 1, 2])
df6 = pd.DataFrame({'A': ['A3', 'A4', 'A5'],
'B': ['B3', 'B4', 'B5']},
index=[3, 4, 5])
# 垂直連接(沿axis=0)
result = pd.concat([df5, df6])
print("\nVertical Concatenation:\n", result)
# 水平連接(沿axis=1)
result = pd.concat([df5, df6], axis=1)
print("\nHorizontal Concatenation:\n", result)
輸出:
Vertical Concatenation:
A B
0 A0 B0
1 A1 B1
2 A2 B2
3 A3 B3
4 A4 B4
5 A5 B5
Horizontal Concatenation:
A B A B
0 A0 B0 NaN NaN
1 A1 B1 NaN NaN
2 A2 B2 NaN NaN
3 NaN NaN A3 B3
4 NaN NaN A4 B4
5 NaN NaN A5 B5
4.2 連接時(shí)處理索引
# 忽略原有索引
result = pd.concat([df5, df6], ignore_index=True)
print("\nConcatenation with Ignored Index:\n", result)
# 添加多級(jí)索引
result = pd.concat([df5, df6], keys=['df5', 'df6'])
print("\nConcatenation with MultiIndex:\n", result)
5. 數(shù)據(jù)比較 (Compare)
5.1 比較兩個(gè)DataFrame
Pandas 提供了多種比較DataFrame的方法。
# 創(chuàng)建兩個(gè)相似但有差異的DataFrame
df7 = pd.DataFrame({'A': [1, 2, 3],
'B': [4, 5, 6]})
df8 = pd.DataFrame({'A': [1, 2, 4],
'B': [4, 6, 6]})
# 使用compare方法(需要Pandas 1.1.0+)
try:
comparison = df7.compare(df8)
print("\nDataFrame Comparison:\n", comparison)
except AttributeError:
print("\ncompare() method requires pandas 1.1.0 or later")
# 替代方法
diff = df7 != df8
print("\nDifference:\n", diff)
輸出(如果使用compare方法):
DataFrame Comparison:
A B
self other self other
2 3.0 4.0 NaN NaN
1 NaN NaN 5.0 6.0
5.2 比較并標(biāo)記差異
# 標(biāo)記所有差異
def highlight_diff(data, color='yellow'):
attr = f'background-color: {color}'
other = data.xs('other', axis='columns', level=-1)
self = data.xs('self', axis='columns', level=-1)
return pd.DataFrame(np.where(self != other, attr, ''),
index=data.index, columns=data.columns)
comparison.style.apply(highlight_diff, axis=None)
6. 其他實(shí)用合并技巧
6.1 合并時(shí)處理重復(fù)列名
# 合并時(shí)有重復(fù)列名
df9 = pd.DataFrame({'key': ['A', 'B', 'C'],
'value': [1, 2, 3]})
df10 = pd.DataFrame({'key': ['B', 'C', 'D'],
'value': [4, 5, 6]})
result = pd.merge(df9, df10, on='key', suffixes=('_left', '_right'))
print("\nMerge with Suffixes:\n", result)
6.2 合并時(shí)驗(yàn)證關(guān)系
# 驗(yàn)證合并關(guān)系(確保是一對(duì)一、一對(duì)多或多對(duì)一)
try:
result = pd.merge(df9, df10, on='key', validate='one_to_one')
print("\nValidated Merge:\n", result)
except Exception as e:
print("\nValidation Error:", e)
7. 性能考慮
合并大型DataFrame
# 創(chuàng)建大型DataFrame
import numpy as np
n = 1000000
big_df1 = pd.DataFrame({'key': np.random.randint(0, 10000, size=n),
'value1': np.random.randn(n)})
big_df2 = pd.DataFrame({'key': np.random.randint(0, 10000, size=n),
'value2': np.random.randn(n)})
# 比較合并方法的性能
%timeit pd.merge(big_df1, big_df2, on='key')
%timeit big_df1.merge(big_df2, on='key')
8. 總結(jié)
1.merge() 是最靈活的數(shù)據(jù)合并方法,支持各種SQL風(fēng)格的連接操作
- 支持內(nèi)連接、左連接、右連接和外連接
- 可以處理多鍵合并和復(fù)雜的合并條件
2.join() 是基于索引的合并便捷方法
- 默認(rèn)按索引連接
- 語法比merge()更簡(jiǎn)潔但功能較少
3.concat() 用于簡(jiǎn)單堆疊數(shù)據(jù)
- 可以沿行(垂直)或列(水平)方向連接
- 適合結(jié)構(gòu)相同的數(shù)據(jù)集合并
4.compare() 用于比較兩個(gè)DataFrame的差異
- 可以高亮顯示差異
- 需要Pandas 1.1.0及以上版本
5.性能考慮
- 對(duì)于大型數(shù)據(jù)集,merge()通常比join()更快
- 合并前適當(dāng)設(shè)置索引可以提高性能
選擇合適的多數(shù)據(jù)操作方法取決于:
- 數(shù)據(jù)的大小和結(jié)構(gòu)
- 需要執(zhí)行的連接類型
- 是否需要保留所有數(shù)據(jù)或只保留匹配項(xiàng)
掌握這些多數(shù)據(jù)操作技術(shù)將大大提高你在實(shí)際數(shù)據(jù)分析工作中的效率和靈活性。
以上就是python pandas多數(shù)據(jù)操作的完整指南的詳細(xì)內(nèi)容,更多關(guān)于python pandas多數(shù)據(jù)操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python?Pandas中數(shù)據(jù)類型查看與轉(zhuǎn)換方法
- Python pandas進(jìn)行數(shù)據(jù)預(yù)處理的實(shí)現(xiàn)
- Python?Pandas輕松實(shí)現(xiàn)數(shù)據(jù)清理
- Python使用pandas實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行特定排序
- 使用Pandas進(jìn)行Excel數(shù)據(jù)處理的操作和技巧
- Pandas數(shù)據(jù)操作分析基本常用的15個(gè)代碼片段
- Pandas數(shù)據(jù)操作及數(shù)據(jù)分析常用技術(shù)介紹
相關(guān)文章
python實(shí)現(xiàn)批量解析郵件并下載附件
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)批量解析郵件并下載附件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Python獲取網(wǎng)頁時(shí)報(bào)HTTP 403錯(cuò)誤(禁止訪問)的解決辦法
這篇文章主要為大家詳細(xì)介紹了Python使用庫獲取網(wǎng)頁時(shí)報(bào)HTTP 403錯(cuò)誤(禁止訪問)的解決辦法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2025-12-12
Python代碼實(shí)現(xiàn)在PowerPoint中添加并控制音頻播放
本文將介紹如何使用 Spire.Presentation for Python 在 PowerPoint 演示文稿中插入音頻文件,控制音頻播放行為以及管理音頻屬性,感興趣的小伙伴可以了解下2026-05-05
使用Python對(duì)零售商品進(jìn)行數(shù)據(jù)分析
這篇文章主要為大家介紹了使用Python對(duì)零售商品進(jìn)行數(shù)據(jù)分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
使用Python實(shí)現(xiàn)將中文語音翻譯成英語音頻功能
本文介紹了中文語音翻譯成英語音頻的實(shí)現(xiàn)方法,主要分為三個(gè)步驟:語音識(shí)別(將中文語音轉(zhuǎn)為文本)、文本翻譯(中文轉(zhuǎn)英文)和語音合成(英文文本轉(zhuǎn)音頻),文章詳細(xì)說明了注意事項(xiàng),需要的朋友可以參考下2025-08-08
django的模型類管理器——數(shù)據(jù)庫操作的封裝詳解
這篇文章主要介紹了django的模型類管理器——數(shù)據(jù)庫操作的封裝詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Python開發(fā)生產(chǎn)環(huán)境常用的4個(gè)工具(實(shí)用推薦)
構(gòu)建優(yōu)秀的軟件需要遵循特定的規(guī)則并執(zhí)行行業(yè)標(biāo)準(zhǔn),如何在真實(shí)的生產(chǎn)環(huán)境開發(fā)中體現(xiàn)呢?在這篇文章中,我將向您展示我在Python項(xiàng)目中設(shè)置的4種工具,以簡(jiǎn)化開發(fā)工作流程并執(zhí)行一些最佳實(shí)踐,這些工具幫助我提高了效率,節(jié)省了時(shí)間,希望你讀完也能有所收獲2024-01-01

