整理一點有用的包,持續更新中~
pandas
數據處理神器,一維、二維數據,安裝命令pip install pandas
讀取文件
import pandas as pd
df = pd.read_csv("data.csv") # 讀取 CSV 文件
df = pd.read_excel("data.xlsx") # 讀取 Excel 文件(默認第一張表)
df = pd.read_json("data.json") # 讀取 JSON 文件
df = pd.read_sql(sql, conn) # 從數據庫讀取(需要已有連接 conn)
寫文件
import pandas as pd
df.to_csv("out.csv", index=False) # 保存為 CSV,不保存行索引
df.to_excel("out.xlsx", index=False) # 保存為 Excel
df.to_json("out.json", orient="records", force_ascii=False) # 保存為 JSON,支持中文
查看數據
import pandas as pd
df.head(5) # 查看前 5 行,默認 head() 是前 5 行
df.tail(5) # 查看後 5 行
df.shape # (行數, 列數)
df.columns # 列名索引
df.dtypes # 每一列的數據類型
df.info() # 表結構概覽(行數、列數、缺失值、類型等)
df.describe() # 數值列的基本統計信息(均值、標準差、分位數等)
索引與切片
import pandas as pd
df["col"] # 選一列,返回 Series
df[["col1", "col2"]] # 選多列,返回 DataFrame
df.iloc[0] # 第 0 行
df.iloc[0:5] # 第 0~4 行
df.iloc[:, 0:3] # 所有行,第 0~2 列
df.iloc[0:5, 1:3] # 第 0~4 行,第 1~2 列
df.loc[0] # index 為 0 的那一行
df.loc[0:10, ["col1", "col2"]] # index 0~10 行,列為 col1、col2
df.loc[df["age"] > 30, :] # 條件篩選:age > 30 的所有列
修改列
import pandas as pd
df["gender"] = df["gender"].replace({"M": "男", "F": "女"}) # 替換某一列值
缺失值處理
import pandas as pd
df.isna() # 返回布爾表,標記是否為缺失
df.isna().sum() # 每一列缺失值數量
df.dropna() # 刪除包含缺失值的行
df.dropna(subset=["col"]) # 僅根據某一列判斷是否刪除行
df.fillna(0) # 把缺失值填成 0
df["col"].fillna(df["col"].mean(), inplace=True) # 用該列均值填充
去重/排序
import pandas as pd
df.drop_duplicates() # 刪除完全相同的重複行
df.drop_duplicates(subset=["uid"]) # 按某幾列去重
df.sort_values("age") # 按 age 升序排序
df.sort_values("age", ascending=False) # 按 age 降序
df.sort_values(["age", "score"], ascending=[True, False]) # 多列排序
重命名/重置索引
import pandas as pd
df.rename(columns={"old_name": "new_name"}, inplace=True) # 改列名
df.reset_index(drop=True, inplace=True) # 重置索引,丟掉舊索引
df.set_index("唯一病案標識", inplace=True) # 把某列設為行索引
字符串處理
import pandas as pd
df["name"].str.lower() # 全小寫
df["name"].str.upper() # 全大寫
df["name"].str.strip() # 去掉首尾空格
df["name"].str.contains("心梗") # 判斷是否包含子串
# 分割字符串到多列
df["full"].str.split("-", expand=True)
時間日期處理
import pandas as pd
df["date"] = pd.to_datetime(df["date"]) # 字符串轉時間類型
df["year"] = df["date"].dt.year # 年
df["month"] = df["date"].dt.month # 月
df["day"] = df["date"].dt.day # 日
df.set_index("date", inplace=True) # 把日期設為索引
df.resample("D").sum() # 按天重採樣
df.resample("M").mean() # 按月求平均
pdfminer.six
可以從pdf中提取純文本,安裝命令pip install pdfminer.six
pdfminer.six:更底層,能拿到 更詳細的佈局和字體信息。配置稍微複雜一點,但更靈活。
PyPDF2:偏向於拆分/合併/旋轉 PDF 文件,文本提取較簡單
pdfplumber:基於 pdfminer.six 封裝的更好用的高級庫,特別適合提表格
提取pdf中的文字
from pdfminer.high_level import extract_text
text = extract_text("example.pdf") # 返回整個 PDF 的文本字符串
text = extract_text(
"example.pdf",
page_numbers=[0, 1], # 指定頁碼(從 0 開始)
maxpages=2, # 最多讀取多少頁
password="", # 有密碼的 PDF 時用
)
按頁面佈局,拿到佈局結構
from pdfminer.high_level import extract_pages
from pdfminer.layout import LTTextContainer
for page_layout in extract_pages("example.pdf"):
for element in page_layout:
if isinstance(element, LTTextContainer):
print(element.get_text())