成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Pandas 進階秘籍:掌握這五個實用技巧,告別復雜數據處理的煩惱

大數據 數據分析
本文將為您揭示 Pandas 進階的五個實用技巧,這些技巧能幫助您在面對復雜數據處理任務時更加游刃有余,提升工作效率,解鎖數據的深層價值。

對于許多初學者來說,掌握Pandas的基礎操作后,如何進一步處理更復雜、更具挑戰性的數據場景,往往是一個瓶頸。本文將為您揭示Pandas進階的5個實用技巧,這些技巧能幫助您在面對復雜數據處理任務時更加游刃有余,提升工作效率,解鎖數據的深層價值。

一、數據的“瑞士軍刀”:Pandas的強大之處

在深入技巧之前,讓我們回顧一下Pandas的核心價值:它提供了一系列高效的數據結構和數據分析工具,使得數據操作變得直觀且富有表現力。從數據加載、清洗、轉換、合并,到統計分析和可視化,Pandas幾乎涵蓋了數據處理的全流程。

1. Pandas的核心數據結構

  • Series: 一維帶標簽的數組,可以存儲任何數據類型。
  • DataFrame: 二維帶標簽的數據結構,由Series組成,可以理解為帶行索引和列標簽的表格。

2. 為什么需要進階技巧?

隨著數據量的增大、數據復雜度的提升,直接使用基礎的Pandas函數可能變得冗長、效率低下,甚至難以實現某些高級操作。進階技巧能夠幫助我們:

  • 提高代碼效率與可讀性。
  • 處理復雜的數據轉換與邏輯。
  • 優化性能,處理大數據集。
  • 實現更高級的數據分析任務。

二、Pandas進階:五個實用技巧解鎖復雜數據處理

以下5個技巧,涵蓋了數據重塑、分組聚合、窗口函數、高效合并以及自定義函數應用等方面,將幫助您在數據處理的道路上更進一步。

技巧一:數據重塑之 pivot 與 melt 的妙用

在數據分析中,我們常常需要將數據從“寬”格式(Wide Format)轉換為“長”格式(Long Format),或者反之。Pandas提供了pivot、pivot_table和melt等函數來靈活地完成數據重塑。

(1) pivot 與 pivot_table: 將“長”變“寬”

  • pivot():用于將長格式(每行是一個觀測值)的數據重塑為寬格式(每列是一個變量),但要求索引列和用于形成新列的列具有唯一性組合。
  • pivot_table():比pivot()更強大,它允許指定一個聚合函數來處理重復的索引/列組合,或者處理缺失值。這是在數據分組后進行重塑的常用方法。

場景:假設我們有一個銷售數據,記錄了每個產品在每個月、每個城市的銷售額。我們想將數據重塑,使得城市作為列,月份作為索引,銷售額作為值。

示例數據 (sales.csv ):

City,Month,Product,Sales
北京,2023-01,A,100
北京,2023-01,B,150
上海,2023-01,A,120
北京,2023-02,A,110
上海,2023-01,B,160
廣州,2023-01,A,90

代碼:

import pandas as pd
import io

csv_data = """City,Month,Product,Sales
北京,2023-01,A,100
北京,2023-01,B,150
上海,2023-01,A,120
北京,2023-02,A,110
上海,2023-01,B,160
廣州,2023-01,A,90
上海,2023-02,A,130
北京,2023-02,B,140
廣州,2023-02,B,100
"""
df_long = pd.read_csv(io.StringIO(csv_data))
df_long['Month'] = pd.to_datetime(df_long['Month']) # 確保月份是日期類型

print("--- 原始長格式數據 ---")
print(df_long)

# 使用pivot_table重塑數據:以Month為索引, City為列, Sales為值
# aggfunc='sum' 表示如果同一月份同一城市有多個產品,則對Sales求和 (此處假設我們只想看總銷售額)
# 如果我們想按Product區分,可以先groupby Product,然后pivot
# 示例:先按City和Month聚合總銷售額
df_agg = df_long.groupby(['Month', 'City'])['Sales'].sum().reset_index()

# 再進行pivot操作
df_wide = df_agg.pivot(index='Month', columns='City', values='Sales')
print("\n--- pivot重塑后的寬格式數據 (按City聚合) ---")
print(df_wide)

# 如果同一月份同一城市有不同產品且想保留Product信息,需要多級pivot或pivot_table
# 例如,想看每個城市每個月的A產品銷售額
df_A_sales = df_long[df_long['Product'] == 'A']
df_wide_A = df_A_sales.pivot_table(index='Month', columns='City', values='Sales', aggfunc='sum')
print("\n--- pivot_table重塑后的寬格式數據 (按City, Product='A'聚合) ---")
print(df_wide_A)

(2) melt(): 將“寬”變“長”

melt()函數用于將寬格式的數據轉換為長格式。它將DataFrame的列“融化”成行,形成兩個新的列:一個表示原始列名(變量名),另一個表示原始列的值。

場景: 當我們有一個包含多個時間點或多個指標的寬格式數據,并希望將其轉換為長格式以便于分析或繪圖時。

示例:

# 使用上面pivot得到的 df_wide 數據
# melt操作將 '北京', '上海', '廣州' 列融化成 'City' 列
# 'Sales'列將是融化后的銷售額值
df_long_again = df_wide.reset_index().melt(
    id_vars=['Month'], # 保留作為標識符的列
    value_vars=['北京', '上海', '廣州'], # 需要融化的列
    var_name='City', # 新的列名,表示原始列名
    value_name='Sales' # 新的列名,表示原始列的值
)
print("\n--- melt重塑后的長格式數據 ---")
print(df_long_again.head())

技巧精髓:

  • 根據分析目標選擇合適的重塑函數 (pivot, pivot_table, melt)。
  • 理解它們的index, columns, values, aggfunc等參數。
  • 數據重塑是數據清洗和特征工程的關鍵步驟,善用它們能極大簡化后續分析。

技巧二:groupby()與agg()的強大組合:多維度分組聚合

分組聚合是數據分析中最核心的操作之一。Pandas的groupby()結合agg()(或直接調用聚合函數如sum, mean, count, size, max, min等)可以實現非常靈活和強大的數據匯總。

(1) groupby() 的工作流程 (Split-Apply-Combine)

  • Split (分割):根據指定的列或條件將DataFrame分割成多個組。
  • Apply (應用):對每個組獨立應用一個函數(聚合、轉換、過濾)。
  • Combine (合并):將應用函數后的結果合并成一個新的DataFrame。

(2) agg() 的威力:一次性執行多個聚合操作

agg()方法允許你對分組后的數據同時應用多個聚合函數,并且可以為每個聚合結果指定自定義的列名。

場景:分析公司不同部門的員工數量、平均薪資、最高薪資以及入職最早的日期。

示例數據:

data = {
    '員工ID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    '姓名': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
    '部門': ['工程部', '市場部', '工程部', '銷售部', '工程部', '市場部', '銷售部', '工程部', '市場部', '銷售部'],
    '薪資': [8000, 6000, 9000, 7000, 8500, 6500, 7500, 9200, 6800, 7200],
    '入職日期': pd.to_datetime(['2020-01-15', '2021-03-20', '2019-05-10', '2022-08-01', '2020-02-20',
                               '2021-05-01', '2022-01-15', '2019-01-01', '2022-05-10', '2021-08-20'])
}
df_emp = pd.DataFrame(data)
print("--- 員工數據 ---")
print(df_emp)

代碼:

# 按部門分組,進行多項聚合
dept_analysis = df_emp.groupby('部門').agg(
    員工數量=('員工ID', 'count'),       # 計算每個部門的員工數量
    平均薪資=('薪資', 'mean'),         # 計算平均薪資
    最高薪資=('薪資', 'max'),          # 計算最高薪資
    最低入職日期=('入職日期', 'min')   # 計算最早入職日期
)

# 重置索引,使'部門'成為普通列
dept_analysis = dept_analysis.reset_index()
# 對薪資進行格式化(可選)
dept_analysis['平均薪資'] = dept_analysis['平均薪資'].map('{:,.2f}'.format)
dept_analysis['最高薪資'] = dept_analysis['最高薪資'].map('{:,.0f}'.format)

print("\n--- 按部門分組聚合分析結果 ---")
print(dept_analysis)

技巧精髓:

  • groupby() 是數據匯總的起點,可以根據一個或多個列進行分組。
  • .agg() 方法是執行復雜聚合的關鍵,允許同時應用多個函數,并自定義輸出列名。
  • 結合 .size() (計算組內元素數量,包括NaN) 和 .count() (計算非NaN元素數量) 可以提供不同維度的計數信息。

技巧三:apply() 與自定義函數:賦予Pandas“智慧”

在某些情況下,內置的聚合函數可能無法滿足復雜的需求。這時,apply() 方法允許我們將自定義的Python函數作用于DataFrame的行、列或分組上,極大地擴展了Pandas的功能。

(11) apply() 的用

apply() 方法可以接受一個函數,并將其應用于DataFrame的軸(axis=0表示列,axis=1表示行)。它非常靈活,可以用于數據轉換、特征工程、復雜邏輯判斷等。

場景:

  • 根據員工的薪資和入職年限,計算一個“綜合評分”。
  • 對詳細地址字符串進行解析,提取省份信息。
  • 對DataFrame的某幾列進行統一的復雜處理。

示例:計算薪資與工作年限的組合評分

# 假設我們想計算一個評分:Salary / (Years_Experience + 1)
# (加上1是為了避免除以零的情況)
def calculate_composite_score(row):
    salary = row['薪資']
    experience = row['工作年限']
    # 處理可能出現的錯誤情況
    if pd.isna(salary) or pd.isna(experience) or experience < 0:
        return np.nan
    return salary / (experience + 1)

# 將函數應用于每一行 (axis=1)
df_emp['綜合評分'] = df_emp.apply(calculate_composite_score, axis=1)

print("\n--- 添加 '綜合評分' 列 ---")
print(df_emp[['姓名', '薪資', '工作年限', '綜合評分']].head())

# 示例:提取省份信息 (簡易處理)
def extract_province(address):
    if pd.isna(address):
        returnNone
    # 假設地址格式是 "省份 + 城市 + 街道..."
    # 這是一個非常簡化的提取邏輯,實際可能需要更復雜的地址解析庫
    parts = address.split('+') # 這里根據模擬數據格式做簡單分隔
    if len(parts) > 0:
        return parts[0] # 假設第一個部分是省份 (或者直接就是城市名稱)
    returnNone

df_emp['省份'] = df_emp['詳細地址'].apply(extract_province) # 假設有詳細地址列
# print(df_emp[['詳細地址', '省份']].head())

雖然apply()非常靈活,但對于大型DataFrame,它可能不如向量化操作(如直接對Series進行數學運算)高效。當可以實現向量化時,優先選擇向量化操作。當需要復雜的行/列邏輯時,apply()是有效的選擇。

技巧精髓:

  • apply() 是Pandas的“瑞士軍刀”,可以執行幾乎任何自定義操作。
  • 理解axis參數是關鍵:axis=0作用于列,axis=1作用于行。

注意性能:對于簡單操作,優先使用向量化方法;對于復雜邏輯,apply()是好幫手。

技巧四:窗口函數 (Window Functions):序列的動態分析

窗口函數允許我們對數據序列(如時間序列)的特定“窗口”內的元素執行計算。這在分析趨勢、計算移動平均、累計值等場景中非常有用。

(1) 滾動窗口 (Rolling) 與擴展窗口 (Expanding)

  • 滾動窗口 (.rolling()):在一個固定大小的窗口上進行計算,窗口會沿著數據序列滑動。
  • 擴展窗口 (.expanding()):窗口大小從第一個元素開始,隨著數據序列的增長而不斷擴大。

(2) 常用窗口函數

.mean(), .sum(), .median(), .std(), .min(), .max(), .count(), .apply()

場景:計算某個產品連續5天的銷售額移動平均值,或者計算自上市以來的累計銷售額。

示例:

# 假設我們有一個按日期排序的銷售數據DataFrame
# df_sales_time = df_sales_time.sort_values('Date')

# 模擬一個時間序列數據 (假設 df_sales 已包含'Month'和'Sales'列,且已排序)
df_sales_time = df_long.sort_values('Month')
print("\n--- 按日期排序的銷售數據 ---")
print(df_sales_time)

# 計算銷售額的3周期滾動平均值
# window=3 表示窗口大小為3,min_periods=1表示即使窗口內元素少于3個也計算 (第一個值是NaN)
df_sales_time['Sales_Rolling_Avg_3'] = df_sales_time['Sales'].rolling(window=3, min_periods=1).mean()
print("\n--- 添加3周期滾動平均值 ---")
print(df_sales_time[['Month', 'Sales', 'Sales_Rolling_Avg_3']])

# 計算銷售額的擴展總和 (累計銷售額)
df_sales_time['Sales_Expanding_Sum'] = df_sales_time['Sales'].expanding().sum()
print("\n--- 添加擴展累計總和 ---")
print(df_sales_time[['Month', 'Sales', 'Sales_Expanding_Sum']])

技巧精髓:

  • 窗口函數是時間序列分析和序列數據處理的利器。
  • 理解window和min_periods參數對于正確使用滾動窗口至關重要。
  • .expanding()適用于計算累積值或自開始以來的聚合值。

技巧五:merge()與join()的靈活運用:高效數據合并

在實際工作中,數據往往分散在多個來源。將它們有效地合并起來是數據分析的關鍵一步。Pandas提供了merge和join兩個強大的函數。

(1) merge():基于鍵的合并

merge()函數可以根據一個或多個鍵(列)將兩個DataFrame連接起來,類似于SQL中的JOIN操作。

  • how參數:控制合并類型,包括inner (交集,默認), left (左連接), right (右連接), outer (并集)。
  • on參數:指定用于合并的鍵(當左右DataFrame的鍵列名相同時)。
  • left_on, right_on:分別指定左右DataFrame的鍵列名(當鍵列名不同時)。
  • left_index=True / right_index=True:使用索引作為合并的鍵。

(2) join():基于索引的合并

join()方法默認使用左側DataFrame的索引和右側DataFrame的索引進行左連接。它也可以通過on參數指定左DataFrame的列與右DataFrame的索引進行連接。通常用于基于索引的合并,在某些情況下比merge更簡潔。

場景:我們有客戶的基本信息表(包含客戶ID)和客戶的交易記錄表(包含客戶ID和交易金額)。需要將它們合并,以便分析每個客戶的總交易額。

示例數據:

# 客戶信息表
df_customers = pd.DataFrame({
    'CustomerID': [101, 102, 103, 104],
    'Name': ['Alice', 'Bob', 'Charlie', 'David'],
    'City': ['北京', '上海', '廣州', '深圳']
})

# 交易記錄表
df_transactions = pd.DataFrame({
    'CustomerID': [101, 101, 102, 103, 101, 102],
    'Amount': [150.5, 200.0, 300.2, 100.0, 180.5, 250.0],
    'Date': pd.to_datetime(['2023-01-10', '2023-01-25', '2023-02-01', '2023-02-15', '2023-03-05', '2023-03-10'])
})
print("\n--- 客戶信息表 ---")
print(df_customers)
print("\n--- 交易記錄表 ---")
print(df_transactions)

# 使用 merge 進行內連接 (只保留左右表都有的CustomerID)
# 假設我們要獲取每個客戶的交易總額
merged_df = pd.merge(df_customers, df_transactions, on='CustomerID', how='left') # 左連接,保留所有客戶信息
print("\n--- merge (左連接) 結果 ---")
print(merged_df)

# 接下來按客戶分組計算總交易額
customer_total_sales = merged_df.groupby('CustomerID')['Amount'].agg(TotalSales='sum').reset_index()
print("\n--- 合并后按客戶ID分組計算總銷售額 ---")
print(customer_total_sales)

# 如果需要將總銷售額合并回客戶基本信息表
final_customer_info = pd.merge(df_customers, customer_total_sales, on='CustomerID', how='left')
# 處理沒有交易的客戶,其TotalSales會是NaN,可以填充為0
final_customer_info['TotalSales'] = final_customer_info['TotalSales'].fillna(0)
print("\n--- 最終合并客戶信息與總銷售額 ---")
print(final_customer_info)

技巧精髓:

  • 根據業務需求選擇合適的合并類型 (how='inner', 'left', 'right', 'outer')。
  • 正確指定連接鍵 (on, left_on, right_on, left_index, right_index) 是合并成功的關鍵。
  • 理解合并操作可能引入的重復行或缺失值,并進行后續處理。

三、結語:精益求精,讓數據分析更上一層樓

Pandas 的強大之處在于其靈活性和表達力。掌握 pivot/melt 的數據重塑,groupby/agg 的分組聚合,apply 的自定義邏輯,rolling/expanding 的序列分析,以及merge/join的高效合并,這些進階技巧將極大地提升你處理復雜數據集的能力。將這些技巧融入日常的數據分析流程,不僅能讓你事半功倍,更能讓你在數據探索的道路上發現更多隱藏的價值。

責任編輯:趙寧寧 來源: Python數智工坊
相關推薦

2025-05-19 08:28:00

2022-11-03 10:28:59

PandasSAC機制

2023-03-24 16:41:36

Pandas技巧數據處理

2020-12-01 09:26:11

Linux 系統 運維

2020-04-08 17:10:03

GitHub代碼開源

2020-08-21 10:45:47

Linux命令文件

2023-09-15 12:34:23

2023-07-24 07:11:43

2020-04-10 16:35:58

GitHub數據網站

2013-09-13 09:29:18

2018-12-25 08:58:46

2021-10-06 13:49:45

網絡安全風險管理信息安全

2023-12-29 08:37:50

死鎖長事務編程式

2024-04-16 08:24:58

Python_str__()方法字符串

2025-06-04 08:55:00

2021-02-20 09:12:04

Linux技巧命令

2023-09-25 13:19:41

pandasPython

2025-05-06 07:15:00

Dask并行計算大數據

2020-08-14 10:57:49

開發技能代碼

2025-03-11 14:09:04

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲视频在线观看 | 亚洲综合大片69999 | 亚洲中国字幕 | 久久久久国产一区二区三区 | 国产美女免费视频 | 青青久在线视频 | 精品伊人久久 | 成人国产精品一级毛片视频毛片 | 亚洲精品91 | 国产精品久久久久久久久久了 | 九色.com | 国产精品永久久久久 | 亚洲a视频 | 国产精品久久网 | 欧美性久久 | 青青草在线视频免费观看 | 国产毛片久久久久久久久春天 | 91精品久久久久久久 | 亚洲1区 | 黄色片免费在线观看 | 国产国拍亚洲精品av | 国内毛片毛片毛片毛片 | 久久福利电影 | 中文字幕第十页 | 久久精品久久久久久 | 午夜精品久久 | 亚洲精品一区二区在线观看 | 一区二区久久 | www.天天操.com| 日本一区二区高清不卡 | 欧美视频中文字幕 | 亚洲91| 亚洲一区二区在线免费观看 | 一区二区三区四区在线视频 | 亚洲一级毛片 | 成人精品一区亚洲午夜久久久 | 精品免费视频 | 精品乱人伦一区二区三区 | 欧美综合一区二区三区 | 国产精品免费av | 99re视频在线 |