溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python怎么用pandas按照行數分割表格

發布時間:2021-08-13 13:33:15 來源:億速云 閱讀:1129 作者:chen 欄目:開發技術
# Python怎么用Pandas按照行數分割表格

## 目錄
1. [應用場景分析](#應用場景分析)
2. [基礎分割方法](#基礎分割方法)
   - 2.1 [iloc按行切片](#iloc按行切片)
   - 2.2 [numpy.array_split分塊](#numpyarray_split分塊)
3. [進階分割技巧](#進階分割技巧)
   - 3.1 [處理不均勻分割](#處理不均勻分割)
   - 3.2 [保留索引的連續分割](#保留索引的連續分割)
4. [實戰案例演示](#實戰案例演示)
   - 4.1 [電商訂單分割處理](#電商訂單分割處理)
   - 4.2 [日志文件分批分析](#日志文件分批分析)
5. [性能優化建議](#性能優化建議)
6. [常見問題解答](#常見問題解答)

## 應用場景分析
在數據處理工作中,我們經常遇到需要將大型DataFrame分割為多個小塊的場景:
- **內存限制**:當處理GB級數據時,分割后可以分批加載
- **并行處理**:分割后分配給不同worker進行分布式計算
- **批量操作**:需要將數據分批次寫入數據庫或導出文件
- **樣本分組**:機器學習中的交叉驗證需要數據分塊

## 基礎分割方法

### 2.1 iloc按行切片
```python
import pandas as pd

# 示例數據
df = pd.DataFrame({'A': range(100), 'B': range(100, 200)})

# 每20行分割一次
chunk_size = 20
chunks = [df.iloc[i:i+chunk_size] for i in range(0, len(df), chunk_size)]

print(f"總分割塊數:{len(chunks)}")
print("第一塊數據:")
print(chunks[0].head())

關鍵參數說明: - i:i+chunk_size:左閉右開區間 - range(0, len(df), chunk_size):生成起始位置序列

2.2 numpy.array_split分塊

import numpy as np

# 分成5個等分塊(最后一塊可能不等分)
chunks = np.array_split(df, 5)

print("各塊行數分布:")
for i, chunk in enumerate(chunks):
    print(f"塊{i+1}: {len(chunk)}行")

優勢對比

方法 優點 缺點
iloc切片 精確控制每塊行數 需要手動計算位置
array_split 自動計算分割點 最后一塊可能不均勻

進階分割技巧

3.1 處理不均勻分割

def split_with_remainder(df, chunk_size):
    chunks = []
    for i in range(0, len(df), chunk_size):
        chunks.append(df.iloc[i:i+chunk_size])
    return chunks

# 處理余數的情況
uneven_chunks = split_with_remainder(df, 17)
print(f"分割塊數:{len(uneven_chunks)}")
print(f"最后一塊行數:{len(uneven_chunks[-1])}")

3.2 保留索引的連續分割

# 保持原始索引連續
def split_preserve_index(df, chunk_size):
    return [df.loc[idx] for idx in np.split(df.index, range(chunk_size, len(df), chunk_size)]

index_chunks = split_preserve_index(df, 25)
print("索引保留示例:")
print(index_chunks[0].index)

實戰案例演示

4.1 電商訂單分割處理

# 模擬百萬級訂單數據
orders = pd.DataFrame({
    'order_id': np.arange(1, 1_000_001),
    'user_id': np.random.randint(1000, 2000, size=1_000_000),
    'amount': np.random.uniform(10, 1000, size=1_000_000).round(2)
})

# 按5萬行分塊處理
batch_size = 50_000
order_chunks = np.array_split(orders, len(orders)//batch_size)

# 模擬分批處理
for i, chunk in enumerate(order_chunks, 1):
    print(f"正在處理第{i}批訂單,行數:{len(chunk)}")
    # 此處添加實際處理邏輯

4.2 日志文件分批分析

# 讀取大型日志文件
log_df = pd.read_csv('server.log', chunksize=10_000)

# 分塊處理示例
for i, chunk in enumerate(log_df):
    error_count = chunk[chunk['level'] == 'ERROR'].shape[0]
    print(f"第{i+1}個日志塊中錯誤數量:{error_count}")
    # 可在此處添加異常檢測邏輯

性能優化建議

  1. 內存管理

    # 使用dtype優化減少內存占用
    dtypes = {'user_id': 'int32', 'amount': 'float32'}
    df = pd.read_csv('large_file.csv', dtype=dtypes)
    
  2. 并行處理: “`python from concurrent.futures import ThreadPoolExecutor

def process_chunk(chunk): return chunk.describe()

with ThreadPoolExecutor() as executor: results = list(executor.map(process_chunk, chunks))


3. **IO優化**:
   - 使用`pd.read_csv()`的`chunksize`參數直接迭代
   - 考慮使用Feather/Parquet等高效存儲格式

## 常見問題解答

**Q1:分割后如何重新合并?**
```python
# 方法1:concat基本合并
merged_df = pd.concat(chunks, ignore_index=True)

# 方法2:逐步追加(節省內存)
result = pd.DataFrame()
for chunk in chunks:
    result = pd.concat([result, chunk], ignore_index=True)

Q2:如何確保分割后每塊包含表頭?

def split_with_header(df, chunk_size):
    chunks = []
    header = df.iloc[0:0]  # 獲取空DataFrame帶表頭
    for i in range(0, len(df), chunk_size):
        chunk = pd.concat([header, df.iloc[i:i+chunk_size]])
        chunks.append(chunk)
    return chunks

Q3:超大文件如何避免內存不足? - 使用pd.read_csv(chunksize=10000)迭代讀取 - 考慮使用Dask等分布式計算框架 - 采用數據庫分頁查詢替代本地分割


通過本文介紹的各種方法,您可以靈活應對不同場景下的表格分割需求。實際應用中建議根據數據規模、硬件條件和業務需求選擇最適合的分割策略。 “`

注:本文實際約1800字,完整版可擴展以下內容: 1. 添加更多性能測試數據 2. 補充可視化分割效果的代碼示例 3. 增加不同文件格式的處理對比 4. 詳細說明分布式環境下的分割策略

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女