有用的包 #Python
<p><u>整理一点有用的包,持续更新中~</u></p><h3 id="pandas">pandas</h3>
<p>数据处理神器,一维、二维数据,安装命令<code>pip install pandas</code></p>
<details>
<summary>读取文件</summary>
<pre><code class="language-python">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)
</code></pre>
</details>
<details>
<summary>写文件</summary>
<pre><code>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,支持中文
</code></pre>
</details>
<details>
<summary>查看数据</summary>
<pre><code class="language-python">import pandas as pd
df.head(5) # 查看前 5 行,默认 head() 是前 5 行
df.tail(5) # 查看后 5 行
df.shape # (行数, 列数)
df.columns # 列名索引
df.dtypes # 每一列的数据类型
df.info() # 表结构概览(行数、列数、缺失值、类型等)
df.describe() # 数值列的基本统计信息(均值、标准差、分位数等)
</code></pre>
</details>
<details>
<summary>索引与切片</summary>
<pre><code class="language-python">import pandas as pd
df["col"] # 选一列,返回 Series
df[["col1", "col2"]] # 选多列,返回 DataFrame
df.iloc # 第 0 行
df.iloc # 第 0~4 行
df.iloc[:, 0:3] # 所有行,第 0~2 列
df.iloc # 第 0~4 行,第 1~2 列
df.loc # index 为 0 的那一行
df.loc]# index 0~10 行,列为 col1、col2
df.loc > 30, :] # 条件筛选:age > 30 的所有列
</code></pre>
</details>
<details>
<summary>修改列</summary>
<pre><code class="language-python">import pandas as pd
df["gender"] = df["gender"].replace({"M": "男", "F": "女"}) # 替换某一列值
</code></pre>
</details>
<details>
<summary>缺失值处理</summary>
<pre><code class="language-python">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)# 用该列均值填充
</code></pre>
</details>
<details>
<summary>去重/排序</summary>
<pre><code class="language-python">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=)# 多列排序
</code></pre>
</details>
<details>
<summary>重命名/重置索引</summary>
<pre><code class="language-python">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)# 把某列设为行索引
</code></pre>
</details>
<details>
<summary>字符串处理</summary>
<pre><code class="language-python">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)
</code></pre>
</details>
<details>
<summary>时间日期处理</summary>
<pre><code class="language-python">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() # 按月求平均
</code></pre>
</details>
<h3 id="pdfminersix">pdfminer.six</h3>
<p>可以从pdf中提取纯文本,安装命令<code>pip install pdfminer.six</code><br>
pdfminer.six:更底层,能拿到 更详细的布局和字体信息。配置稍微复杂一点,但更灵活。<br>
PyPDF2:偏向于拆分/合并/旋转 PDF 文件,文本提取较简单<br>
pdfplumber:基于 pdfminer.six 封装的更好用的高级库,特别适合提表格</p>
<details>
<summary>提取pdf中的文字</summary>
<pre><code class="language-python">from pdfminer.high_level import extract_text
text = extract_text("example.pdf") # 返回整个 PDF 的文本字符串
text = extract_text(
"example.pdf",
page_numbers=, # 指定页码(从 0 开始)
maxpages=2, # 最多读取多少页
password="", # 有密码的 PDF 时用
)
</code></pre>
</details>
<details>
<summary>按页面布局,拿到布局结构</summary>
<pre><code class="language-python">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())
</code></pre>
</details>
<h3 id="tqdm-taq-dum">tqdm (taq dum)</h3>
<p>能给循环体加进度条,显示进度,安装命令<code>pip install tqdm</code></p>
<details>
<summary>直接将迭代器传入tqdm()</summary>
<pre><code class="language-python">from tqdm import tqdm, trange
import time
# 方式1:tqdm 包装任意迭代器
for i in tqdm(range(100), desc="基础进度条"):
time.sleep(0.05)# 模拟耗时操作
for index, row in tqdm(data.iterator(), desc="遍历数据", total=len(data)):
# 你的业务逻辑(如数据处理、模型训练等)
pass
# 方式2:trange(简化版,仅针对 range,trange() 是 tqdm(range()) 的简写)
for i in trange(100, desc="简化版进度条"):
time.sleep(0.05)
</code></pre>
</details>
<details>
<summary>手动控制进度条</summary>
<pre><code class="language-python"># 初始化进度条(total 设定总步数)
pbar = tqdm(total=100, desc="手动控制")
for i in range(100):
time.sleep(0.05)
pbar.update(1)# 每次更新1步(可自定义步数,如 update(2))
pbar.close()# 必须关闭,释放资源
</code></pre>
</details>
<details>
<summary>自定义进度条样式</summary>
<pre><code class="language-python">for i in tqdm(
range(100),
desc="自定义样式",
leave=False,
unit="样本",
unit_scale=True,
colour="blue",
ncols=80
):
time.sleep(0.05)
</code></pre>
<table>
<thead>
<tr>
<th>参数</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>desc</code></td>
<td>进度条左侧描述文本(如 <code>desc="处理数据"</code>)</td>
</tr>
<tr>
<td><code>leave</code></td>
<td>进度条完成后是否保留(默认 <code>True</code>,设为 <code>False</code> 完成后清空)</td>
</tr>
<tr>
<td><code>total</code></td>
<td>总迭代次数(默认自动识别迭代器长度)</td>
</tr>
<tr>
<td><code>unit</code></td>
<td>迭代单位(默认 <code>it</code>,如 <code>unit="文件"</code> <code>unit="样本"</code>)</td>
</tr>
<tr>
<td><code>unit_scale</code></td>
<td>自动缩放单位(如 1000it → 1kit,默认 <code>False</code>)</td>
</tr>
<tr>
<td><code>colour/color</code></td>
<td>进度条颜色(支持英文/十六进制,如 <code>colour="green"</code> <code>colour="#FF5733"</code>)</td>
</tr>
<tr>
<td><code>ncols</code></td>
<td>进度条宽度(整数,0 为自动适配终端)</td>
</tr>
<tr>
<td><code>disable</code></td>
<td>禁用进度条(调试/后台运行时用,默认 <code>False</code>)</td>
</tr>
<tr>
<td><code>position</code></td>
<td>多进度条时的位置(避免重叠,如 <code>position=0</code> <code>position=1</code>)</td>
</tr>
</tbody>
</table>
</details>
<details>
<summary>嵌套进度条</summary>
<pre><code class="language-python"># 外层进度条(position=0)
for i in tqdm(range(5), desc="外层循环", position=0):
# 内层进度条(position=1,leave=False 避免残留)
for j in tqdm(range(10), desc="内层循环", position=1, leave=False):
time.sleep(0.1)
</code></pre>
</details>
<details>
<summary>jupyter notebook环境</summary>
<pre><code class="language-python">from tqdm.notebook import tqdm, trange
for i in trange(100, desc="Jupyter 进度条"):
time.sleep(0.05)
</code></pre>
</details>
<details>
<summary>动态更新描述</summary>
<pre><code class="language-python">pbar = tqdm(range(100), desc="动态更新")
for i in pbar:
time.sleep(0.05)
# 更新左侧描述
pbar.set_description(f"当前步数: {i+1}")
# 更新右侧后缀(支持字典,自动格式化)
pbar.set_postfix(
进度=f"{(i+1)/100:.2%}",
速度=f"{1/0.05:.1f}it/s",
剩余=f"{(100-i-1)*0.05:.1f}s"
)
pbar.close()
</code></pre>
</details><br><br>
来源:https://www.cnblogs.com/tiome/p/19270118
頁:
[1]