偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

一、數(shù)據(jù)的“瑞士軍刀”:Pandas的強大之處

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

1. Pandas的核心數(shù)據(jù)結構

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

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

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

  • 提高代碼效率與可讀性。
  • 處理復雜的數(shù)據(jù)轉換與邏輯。
  • 優(yōu)化性能,處理大數(shù)據(jù)集。
  • 實現(xiàn)更高級的數(shù)據(jù)分析任務。

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

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

技巧一:數(shù)據(jù)重塑之 pivot 與 melt 的妙用

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

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

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

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

示例數(shù)據(jù) (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("--- 原始長格式數(shù)據(jù) ---")
print(df_long)

# 使用pivot_table重塑數(shù)據(jù):以Month為索引, City為列, Sales為值
# aggfunc='sum' 表示如果同一月份同一城市有多個產(chǎn)品,則對Sales求和 (此處假設我們只想看總銷售額)
# 如果我們想按Product區(qū)分,可以先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重塑后的寬格式數(shù)據(jù) (按City聚合) ---")
print(df_wide)

# 如果同一月份同一城市有不同產(chǎn)品且想保留Product信息,需要多級pivot或pivot_table
# 例如,想看每個城市每個月的A產(chǎn)品銷售額
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重塑后的寬格式數(shù)據(jù) (按City, Product='A'聚合) ---")
print(df_wide_A)

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

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

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

示例:

# 使用上面pivot得到的 df_wide 數(shù)據(jù)
# 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重塑后的長格式數(shù)據(jù) ---")
print(df_long_again.head())

技巧精髓:

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

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

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

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

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

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

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

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

示例數(shù)據(jù):

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("--- 員工數(shù)據(jù) ---")
print(df_emp)

代碼:

# 按部門分組,進行多項聚合
dept_analysis = df_emp.groupby('部門').agg(
    員工數(shù)量=('員工ID', 'count'),       # 計算每個部門的員工數(shù)量
    平均薪資=('薪資', '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() 是數(shù)據(jù)匯總的起點,可以根據(jù)一個或多個列進行分組。
  • .agg() 方法是執(zhí)行復雜聚合的關鍵,允許同時應用多個函數(shù),并自定義輸出列名。
  • 結合 .size() (計算組內(nèi)元素數(shù)量,包括NaN) 和 .count() (計算非NaN元素數(shù)量) 可以提供不同維度的計數(shù)信息。

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

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

(11) apply() 的用

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

場景:

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

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

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

# 將函數(shù)應用于每一行 (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('+') # 這里根據(jù)模擬數(shù)據(jù)格式做簡單分隔
    if len(parts) > 0:
        return parts[0] # 假設第一個部分是省份 (或者直接就是城市名稱)
    returnNone

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

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

技巧精髓:

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

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

技巧四:窗口函數(shù) (Window Functions):序列的動態(tài)分析

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

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

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

(2) 常用窗口函數(shù)

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

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

示例:

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

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

# 計算銷售額的3周期滾動平均值
# window=3 表示窗口大小為3,min_periods=1表示即使窗口內(nèi)元素少于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']])

技巧精髓:

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

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

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

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

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

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

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

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

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

示例數(shù)據(jù):

# 客戶信息表
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 進行內(nèi)連接 (只保留左右表都有的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)

技巧精髓:

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

三、結語:精益求精,讓數(shù)據(jù)分析更上一層樓

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

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

2025-05-19 08:28:00

2022-11-03 10:28:59

PandasSAC機制

2023-03-24 16:41:36

Pandas技巧數(shù)據(jù)處理

2020-12-01 09:26:11

Linux 系統(tǒng) 運維

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數(shù)據(jù)網(wǎng)站

2013-09-13 09:29:18

2018-12-25 08:58:46

2021-10-06 13:49:45

網(wǎng)絡安全風險管理信息安全

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并行計算大數(shù)據(jù)

2020-08-14 10:57:49

開發(fā)技能代碼

2025-03-11 14:09:04

點贊
收藏

51CTO技術棧公眾號