亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

20個(gè)Python中pandas數(shù)據(jù)處理的高級(jí)技巧

 更新時(shí)間:2025年06月18日 09:15:19   作者:天天進(jìn)步2015  
在數(shù)據(jù)科學(xué)和數(shù)據(jù)分析領(lǐng)域,Python的pandas庫(kù)已經(jīng)成為處理結(jié)構(gòu)化數(shù)據(jù)的標(biāo)準(zhǔn)工具,本文將介紹20個(gè)pandas高級(jí)技巧,幫助大家提升數(shù)據(jù)處理和分析的能力

引言

在數(shù)據(jù)科學(xué)和數(shù)據(jù)分析領(lǐng)域,Python的pandas庫(kù)已經(jīng)成為處理結(jié)構(gòu)化數(shù)據(jù)的標(biāo)準(zhǔn)工具。雖然許多數(shù)據(jù)科學(xué)家和分析師都熟悉pandas的基本操作,但該庫(kù)中隱藏著許多強(qiáng)大的高級(jí)功能,可以顯著提高數(shù)據(jù)處理的效率和靈活性。本文將介紹20個(gè)pandas高級(jí)技巧,幫助你提升數(shù)據(jù)處理和分析的能力,讓你的代碼更加簡(jiǎn)潔、高效且專業(yè)。

1. 高效數(shù)據(jù)讀取與導(dǎo)出

技巧1:使用適當(dāng)?shù)臄?shù)據(jù)類型

在讀取大型數(shù)據(jù)集時(shí),指定正確的數(shù)據(jù)類型可以顯著減少內(nèi)存使用并提高性能:

import pandas as pd
import numpy as np

# 定義數(shù)據(jù)類型字典
dtypes = {
    'id': np.int32,
    'numeric_col': np.float32,
    'category_col': 'category'
}

# 讀取時(shí)指定數(shù)據(jù)類型
df = pd.read_csv('large_file.csv', dtype=dtypes)

技巧2:分塊讀取大文件

處理超大文件時(shí),可以使用分塊讀取避免內(nèi)存溢出:

chunks = []
for chunk in pd.read_csv('huge_file.csv', chunksize=100000):
    # 對(duì)每個(gè)塊進(jìn)行處理
    processed_chunk = some_processing_function(chunk)
    chunks.append(processed_chunk)

# 合并所有處理過(guò)的塊
result = pd.concat(chunks)

技巧3:高效導(dǎo)出數(shù)據(jù)

導(dǎo)出大型DataFrame時(shí),可以使用更高效的方法:

# 使用Apache Parquet格式保存數(shù)據(jù)(需要安裝pyarrow)
df.to_parquet('data.parquet', engine='pyarrow', compression='snappy')

# 使用HDF5格式(需要安裝tables)
df.to_hdf('data.h5', key='df', mode='w')

技巧4:使用SQL查詢讀取數(shù)據(jù)

直接從數(shù)據(jù)庫(kù)使用SQL查詢讀取數(shù)據(jù):

import sqlite3

conn = sqlite3.connect('database.db')
df = pd.read_sql_query("SELECT * FROM table WHERE column > 5", conn)
conn.close()

2. 數(shù)據(jù)轉(zhuǎn)換與重塑

技巧5:使用melt和pivot進(jìn)行數(shù)據(jù)重塑

將寬格式數(shù)據(jù)轉(zhuǎn)換為長(zhǎng)格式,反之亦然:

# 寬格式轉(zhuǎn)長(zhǎng)格式
long_df = pd.melt(
    wide_df, 
    id_vars=['id', 'name'], 
    value_vars=['score1', 'score2', 'score3'],
    var_name='test',
    value_name='score'
)

# 長(zhǎng)格式轉(zhuǎn)寬格式
wide_df = long_df.pivot(
    index='id',
    columns='test',
    values='score'
).reset_index()

技巧6:使用explode展開(kāi)列表值

將包含列表的單元格展開(kāi)為多行:

df = pd.DataFrame({
    'A': [[1, 2, 3], [4, 5], [6]],
    'B': ['a', 'b', 'c']
})

# 展開(kāi)A列
exploded_df = df.explode('A')

技巧7:使用stack和unstack進(jìn)行多級(jí)索引轉(zhuǎn)換

處理多級(jí)索引數(shù)據(jù):

# 將列索引轉(zhuǎn)為行索引的一部分
stacked = df.stack()

# 將行索引的一部分轉(zhuǎn)為列索引
unstacked = stacked.unstack()

技巧8:使用map、apply和applymap進(jìn)行數(shù)據(jù)轉(zhuǎn)換

不同粒度的數(shù)據(jù)轉(zhuǎn)換:

# 對(duì)Series中的每個(gè)元素應(yīng)用函數(shù)
df['category'] = df['category'].map({'A': 'Group1', 'B': 'Group2'})

# 對(duì)DataFrame的每一行或每一列應(yīng)用函數(shù)
df['total'] = df[['col1', 'col2']].apply(sum, axis=1)

# 對(duì)DataFrame中的每個(gè)元素應(yīng)用函數(shù)
df = df.applymap(lambda x: x.lower() if isinstance(x, str) else x)

3. 高級(jí)索引與選擇

技巧9:使用.loc和.iloc進(jìn)行精確索引

高效地選擇數(shù)據(jù):

# 基于標(biāo)簽的索引
subset = df.loc[df['age'] > 30, ['name', 'salary']]

# 基于位置的索引
first_five_rows_three_cols = df.iloc[0:5, 0:3]

# 混合索引
mixed_selection = df.loc[df['status'] == 'active', df.columns[2:5]]

技巧10:使用query方法進(jìn)行高效過(guò)濾

使用字符串表達(dá)式過(guò)濾數(shù)據(jù):

# 傳統(tǒng)方法
filtered_df = df[(df['age'] > 30) & (df['salary'] > 50000)]

# 使用query方法(更易讀且通常更快)
filtered_df = df.query('age > 30 and salary > 50000')

# 使用變量
min_age = 30
filtered_df = df.query('age > @min_age')

技巧11:使用where進(jìn)行條件替換

基于條件替換值:

# 將不滿足條件的值替換為NaN
df_modified = df.where(df > 0)

# 將不滿足條件的值替換為指定值
df_modified = df.where(df > 0, -1)

技巧12:使用mask進(jìn)行條件替換

與where相反的操作:

# 將滿足條件的值替換為NaN
df_modified = df.mask(df < 0)

# 將滿足條件的值替換為指定值
df_modified = df.mask(df < 0, 0)

4. 分組操作與聚合

技巧13:使用groupby的高級(jí)功能

超越基本分組聚合:

# 多列分組
result = df.groupby(['department', 'title']).agg({'salary': ['mean', 'median', 'std'], 'age': 'mean'})

# 使用自定義聚合函數(shù)
def iqr(x):
    return x.quantile(0.75) - x.quantile(0.25)

result = df.groupby('department').agg({'salary': [iqr, lambda x: x.max() - x.min()]})

# 使用命名聚合
result = df.groupby('department').agg(
    avg_salary=('salary', 'mean'),
    max_age=('age', 'max'),
    min_age=('age', 'min')
)

技巧14:使用transform進(jìn)行組內(nèi)轉(zhuǎn)換

在不改變DataFrame形狀的情況下應(yīng)用組級(jí)別的計(jì)算:

# 添加組平均值列
df['salary_group_mean'] = df.groupby('department')['salary'].transform('mean')

# 使用自定義轉(zhuǎn)換函數(shù)
df['salary_normalized'] = df.groupby('department')['salary'].transform(lambda x: (x - x.mean()) / x.std())

# 計(jì)算組內(nèi)排名
df['salary_rank'] = df.groupby('department')['salary'].transform('rank', method='dense')

技巧15:使用filter篩選組

基于組級(jí)別條件篩選數(shù)據(jù):

# 僅保留平均工資超過(guò)50000的部門
high_paying_depts = df.groupby('department').filter(lambda x: x['salary'].mean() > 50000)

# 僅保留至少有10名員工的部門
large_depts = df.groupby('department').filter(lambda x: len(x) >= 10)

技巧16:使用pipe構(gòu)建數(shù)據(jù)處理管道

創(chuàng)建可重用的數(shù)據(jù)處理流程:

def add_features(df):
    df['salary_to_age_ratio'] = df['salary'] / df['age']
    return df

def filter_outliers(df, column, lower=0.01, upper=0.99):
    lower_bound = df[column].quantile(lower)
    upper_bound = df[column].quantile(upper)
    return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]

# 構(gòu)建處理管道
processed_df = (df
                .pipe(add_features)
                .pipe(filter_outliers, 'salary')
                .pipe(filter_outliers, 'age'))

5. 時(shí)間序列數(shù)據(jù)處理

技巧17:使用日期范圍和頻率

創(chuàng)建和操作日期序列:

# 創(chuàng)建日期范圍
date_range = pd.date_range(start='2025-01-01', end='2025-12-31', freq='B')  # B表示工作日

???????# 創(chuàng)建月末日期序列
month_ends = pd.date_range(start='2025-01-01', periods=12, freq='M')

# 創(chuàng)建季度日期
quarters = pd.date_range(start='2025-01-01', periods=4, freq='Q')

技巧18:時(shí)間序列重采樣

改變時(shí)間序列的頻率:

# 將日數(shù)據(jù)聚合為月數(shù)據(jù)
monthly_data = daily_data.resample('M').mean()

# 將小時(shí)數(shù)據(jù)聚合為日數(shù)據(jù),并使用不同的聚合方法
daily_stats = hourly_data.resample('D').agg({
    'temperature': 'mean',
    'humidity': 'mean',
    'rainfall': 'sum',
    'wind_speed': ['min', 'max', 'mean']
})

# 將低頻數(shù)據(jù)轉(zhuǎn)換為高頻數(shù)據(jù)(向前填充)
hourly_data = daily_data.resample('H').ffill()

技巧19:時(shí)間序列滾動(dòng)窗口計(jì)算

計(jì)算移動(dòng)平均、累積和等:

# 7天移動(dòng)平均
df['7d_moving_avg'] = df['value'].rolling(window=7).mean()

# 30天指數(shù)加權(quán)移動(dòng)平均
df['30d_ewm'] = df['value'].ewm(span=30).mean()

# 累積計(jì)算
df['cumulative_sum'] = df['value'].cumsum()
df['cumulative_product'] = df['value'].cumprod()

# 使用自定義窗口函數(shù)
df['rolling_median'] = df['value'].rolling(window=7).apply(lambda x: np.median(x))

技巧20:時(shí)區(qū)處理

處理不同時(shí)區(qū)的數(shù)據(jù):

# 將時(shí)間戳轉(zhuǎn)換為時(shí)區(qū)感知
df['timestamp'] = pd.to_datetime(df['timestamp']).dt.tz_localize('UTC')

# 轉(zhuǎn)換時(shí)區(qū)
df['local_time'] = df['timestamp'].dt.tz_convert('Asia/Shanghai')

# 移除時(shí)區(qū)信息
df['naive_time'] = df['timestamp'].dt.tz_localize(None)

# 在不同時(shí)區(qū)之間進(jìn)行日期比較
mask = (df['timestamp'] >= pd.Timestamp('2025-01-01', tz='UTC')) & \
       (df['timestamp'] <= pd.Timestamp('2025-01-31', tz='UTC'))
filtered_df = df[mask]

6. 性能優(yōu)化技巧

技巧21:使用inplace=True減少內(nèi)存使用

在適當(dāng)?shù)那闆r下原地修改數(shù)據(jù):

# 不創(chuàng)建新的DataFrame
df.fillna(0, inplace=True)
df.drop('unused_column', axis=1, inplace=True)
df.reset_index(inplace=True)

注意:雖然inplace=True可以減少內(nèi)存使用,但在某些情況下可能會(huì)降低性能,并且使代碼的流式處理變得困難。在現(xiàn)代pandas版本中,推薦的做法是避免使用inplace=True,而是使用方法鏈。

技巧22:使用numba加速自定義函數(shù)

對(duì)于計(jì)算密集型操作,使用numba可以顯著提高性能:

import numba

@numba.jit(nopython=True)
def fast_calculation(array):
    result = np.zeros_like(array)
    for i in range(len(array)):
        result[i] = some_complex_math(array[i])
    return result

df['result'] = fast_calculation(df['value'].values)

技巧23:使用swifter并行處理

自動(dòng)并行化pandas操作:

# 安裝:pip install swifter
import swifter

# 替代普通的apply操作
df['result'] = df['complex_column'].swifter.apply(complex_function)

技巧24:使用eval和query進(jìn)行高性能操作

對(duì)于大型DataFrame,使用這些方法可以避免創(chuàng)建中間對(duì)象:

# 傳統(tǒng)方式
df['C'] = df['A'] + df['B']
df = df[(df['A'] < 100) & (df['B'] > 50)]

# 高性能方式
df = df.eval('C = A + B')
df = df.query('A < 100 and B > 50')

7. 可視化增強(qiáng)

技巧25:使用內(nèi)置樣式

利用pandas的內(nèi)置樣式增強(qiáng)可視化效果:

# 設(shè)置繪圖樣式
plt.style.use('ggplot')

# 使用pandas內(nèi)置繪圖功能
df.plot(kind='bar', figsize=(12, 6))

# 使用多種圖表類型
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
df.plot(kind='line', ax=axes[0, 0], title='Line Plot')
df.plot(kind='bar', ax=axes[0, 1], title='Bar Plot')
df.plot(kind='box', ax=axes[1, 0], title='Box Plot')
df.plot(kind='scatter', x='A', y='B', ax=axes[1, 1], title='Scatter Plot')

技巧26:使用styler美化DataFrame顯示

在Jupyter Notebook中美化DataFrame的顯示:

# 高亮最大值
styled_df = df.style.highlight_max(color='lightgreen')

# 根據(jù)條件設(shè)置樣式
styled_df = df.style.applymap(lambda x: 'background-color: yellow' if x < 0 else '')

# 使用漸變顏色
styled_df = df.style.background_gradient(cmap='viridis')

# 格式化數(shù)值
styled_df = df.style.format({
    'A': '{:.2f}',
    'B': '{:+.2f}',
    'C': '{:.2%}'
})

技巧27:交互式可視化

結(jié)合其他庫(kù)創(chuàng)建交互式可視化:

# 使用plotly(需要安裝plotly)
import plotly.express as px
fig = px.line(df, x='date', y='value', color='category')
fig.show()

# 使用hvplot(需要安裝hvplot和holoviews)
import hvplot.pandas
interactive_plot = df.hvplot.scatter(x='A', y='B', by='category', hover_cols=['C', 'D'])

8. 綜合應(yīng)用示例

下面我們通過(guò)一個(gè)綜合示例,展示如何將這些高級(jí)技巧應(yīng)用到實(shí)際數(shù)據(jù)分析中:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 1. 高效讀取數(shù)據(jù)
sales_data = pd.read_csv('sales_data.csv', 
                         parse_dates=['date'],
                         dtype={'product_id': 'category', 'store_id': 'category'})

# 2. 數(shù)據(jù)轉(zhuǎn)換
# 添加時(shí)間特征
sales_data['year'] = sales_data['date'].dt.year
sales_data['month'] = sales_data['date'].dt.month
sales_data['day_of_week'] = sales_data['date'].dt.dayofweek

# 3. 高級(jí)索引與過(guò)濾
# 使用query篩選數(shù)據(jù)
recent_sales = sales_data.query('date >= "2024-01-01" and revenue > 1000')

# 4. 分組操作與聚合
# 按產(chǎn)品和月份分組,計(jì)算多個(gè)統(tǒng)計(jì)量
monthly_stats = sales_data.groupby(['product_id', 'year', 'month']).agg(
    total_revenue=('revenue', 'sum'),
    avg_revenue=('revenue', 'mean'),
    total_units=('units', 'sum'),
    transaction_count=('transaction_id', 'nunique')
).reset_index()

# 5. 時(shí)間序列處理
# 將數(shù)據(jù)重采樣為周頻率
weekly_sales = sales_data.set_index('date').groupby('product_id')['revenue'].resample('W').sum()

# 計(jì)算移動(dòng)平均
monthly_sales = sales_data.set_index('date')['revenue'].resample('M').sum()
monthly_sales_smoothed = monthly_sales.rolling(window=3).mean()

# 6. 性能優(yōu)化
# 使用eval計(jì)算新列
sales_data = sales_data.eval('revenue_per_unit = revenue / units')

# 7. 可視化
plt.figure(figsize=(12, 6))
sns.lineplot(x=monthly_sales.index, y=monthly_sales.values, label='Monthly Sales')
sns.lineplot(x=monthly_sales_smoothed.index, y=monthly_sales_smoothed.values, label='3-Month Moving Average')
plt.title('Monthly Sales Trend with Moving Average')
plt.xlabel('Date')
plt.ylabel('Revenue')
plt.legend()
plt.tight_layout()
plt.show()

總結(jié)

掌握這些pandas高級(jí)技巧可以顯著提高你的數(shù)據(jù)處理和分析效率。從高效的數(shù)據(jù)讀取和導(dǎo)出,到復(fù)雜的數(shù)據(jù)轉(zhuǎn)換、高級(jí)索引、分組聚合、時(shí)間序列處理、性能優(yōu)化和可視化增強(qiáng),這些技巧涵蓋了數(shù)據(jù)科學(xué)工作流程的各個(gè)方面。

通過(guò)不斷實(shí)踐和應(yīng)用這些技巧,你將能夠編寫更簡(jiǎn)潔、高效和專業(yè)的數(shù)據(jù)分析代碼,從而更快地從數(shù)據(jù)中獲取洞察。

以上就是20個(gè)Python中pandas數(shù)據(jù)處理的高級(jí)技巧的詳細(xì)內(nèi)容,更多關(guān)于Python pandas的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python數(shù)組條件過(guò)濾filter函數(shù)使用示例

    Python數(shù)組條件過(guò)濾filter函數(shù)使用示例

    數(shù)組條件過(guò)濾簡(jiǎn)潔實(shí)現(xiàn)方式,使用filter函數(shù),實(shí)現(xiàn)一個(gè)條件判斷函數(shù)即可,示例代碼如下
    2014-07-07
  • Python中字符串的修改及傳參詳解

    Python中字符串的修改及傳參詳解

    最近在一次使用python實(shí)現(xiàn)字符串反轉(zhuǎn)的時(shí)候,發(fā)現(xiàn)寫出的代碼居然是錯(cuò)誤的,于是通過(guò)思考后決定要總結(jié)下這次的經(jīng)歷,于是寫了這篇文章,本文的內(nèi)容主要給大家介紹了Python中字符串的修改及傳參,有需要的朋友們可以參考借鑒,下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • 使用Python分析數(shù)據(jù)并進(jìn)行搜索引擎優(yōu)化的操作步驟

    使用Python分析數(shù)據(jù)并進(jìn)行搜索引擎優(yōu)化的操作步驟

    在互聯(lián)網(wǎng)時(shí)代,網(wǎng)站數(shù)據(jù)是一種寶貴的資源,可以用來(lái)分析用戶行為、市場(chǎng)趨勢(shì)、競(jìng)爭(zhēng)對(duì)手策略等,本文將介紹如何使用Python爬取網(wǎng)站數(shù)據(jù),并進(jìn)行搜索引擎優(yōu)化,,需要的朋友可以參考下
    2023-08-08
  • Python?Socket實(shí)現(xiàn)遠(yuǎn)程木馬彈窗詳解

    Python?Socket實(shí)現(xiàn)遠(yuǎn)程木馬彈窗詳解

    這篇文章主要介紹了Python?Socket實(shí)現(xiàn)遠(yuǎn)程木馬彈窗詳解,Socket用來(lái)描述IP地址和端口,是通信鏈的句柄,應(yīng)用程序可以通過(guò)Socket向網(wǎng)絡(luò)發(fā)送請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求
    2022-07-07
  • python爬取足球直播吧五大聯(lián)賽積分榜

    python爬取足球直播吧五大聯(lián)賽積分榜

    這篇文章主要為大家詳細(xì)介紹了python爬取足球直播吧五大聯(lián)賽積分榜,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 利用Python如何實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的接口自動(dòng)化測(cè)試

    利用Python如何實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的接口自動(dòng)化測(cè)試

    這篇文章主要給大家介紹了關(guān)于利用Python如何實(shí)現(xiàn)數(shù)據(jù)驅(qū)動(dòng)的接口自動(dòng)化測(cè)試的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們來(lái)一起看看吧
    2018-05-05
  • python基礎(chǔ)之文件操作

    python基礎(chǔ)之文件操作

    這篇文章主要介紹了python文件操作,實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下
    2021-10-10
  • Python semaphore evevt生產(chǎn)者消費(fèi)者模型原理解析

    Python semaphore evevt生產(chǎn)者消費(fèi)者模型原理解析

    這篇文章主要介紹了Python semaphore evevt生產(chǎn)者消費(fèi)者模型原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • python圖片驗(yàn)證碼識(shí)別最新模塊muggle_ocr的示例代碼

    python圖片驗(yàn)證碼識(shí)別最新模塊muggle_ocr的示例代碼

    這篇文章主要介紹了python圖片驗(yàn)證碼識(shí)別最新模塊muggle_ocr的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • django商品分類及商品數(shù)據(jù)建模實(shí)例詳解

    django商品分類及商品數(shù)據(jù)建模實(shí)例詳解

    這篇文章主要介紹了django商品分類及商品數(shù)據(jù)建模實(shí)例代碼內(nèi)容,需要的朋友們學(xué)習(xí)參考下。
    2020-01-01

最新評(píng)論