Python :Pandas
Pandas的核心内容
1. Pandas 是什么?
- 定义:Pandas 是 Python 中用于数据操作和分析的核心库,尤其擅长处理结构化数据(如表格、时间序列)。
- 核心数据结构:
-
Series
:一维数组,带标签(类似字典)。 -
DataFrame
:二维表格,由多个Series
组成(核心工具)。
-
1.1 Series(一维带标签数组)
-
创建 Series:
import pandas as pd # 从列表创建 s = pd.Series([10, 20, 30, 40], name='age', index=['a', 'b', 'c', 'd']) print(s)
输出:
a 10 b 20 c 30 d 40 Name: age, dtype: int64
-
操作 Series:
s.values # 输出数组:[10, 20, 30, 40] s.index # 输出索引:Index(['a', 'b', 'c', 'd'], dtype='object') s['a'] # 按标签取值 → 10 s[0] # 按位置取值 → 10
1.2 DataFrame(二维表格数据)
-
创建 DataFrame:
data = { 'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35], 'city': ['New York', 'Paris', 'London'] } df = pd.DataFrame(data) print(df)
输出:
name age city 0 Alice 25 New York 1 Bob 30 Paris 2 Charlie 35 London
-
关键属性:
df.shape # 形状:(3, 3) df.columns # 列名:Index(['name', 'age', 'city'], dtype='object') df.index # 行索引:RangeIndex(start=0, stop=3, step=1)
2. 核心操作详解
2.1 创建 DataFrame
import pandas as pd
# 从字典创建
data = {
"Name": ["Alice", "Bob", "Charlie"],
"Age": [25, 30, 35],
"City": ["New York", "Paris", "London"]
}
df = pd.DataFrame(data)
print(df)
输出:
Name Age City
0 Alice 25 New York
1 Bob 30 Paris
2 Charlie 35 London
数据输入与输出
2.1.1读取数据
# 从 CSV 读取 df = pd.read_csv('data.csv', encoding='utf-8', parse_dates=['date_column']) # 从 Excel 读取 df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 常用参数: # - header=0(指定列标题行) # - na_values=['NA', 'N/A'](定义缺失值符号)
2.1.2保存数据
# 保存为 CSV df.to_csv('output.csv', index=False) # 保存为 Excel df.to_excel('output.xlsx', sheet_name='Data')
2.2 数据查看与统计
# 查看前3行
df.head(3)
# 查看数据基本信息(列名、类型、缺失值)
df.info()
# 描述性统计(数值列)
df.describe()
# 查看唯一值
df["City"].unique() # 输出:['New York', 'Paris', 'London']
数据清洗与预处理
处理缺失值
# 检查缺失值 df.isnull().sum() # 删除缺失值 df.dropna(axis=0) # 删除含缺失值的行 df.dropna(subset=['age']) # 删除 age 列缺失的行 # 填充缺失值 df['age'].fillna(df['age'].mean(), inplace=True) # 用均值填充 df.fillna({'city': 'Unknown', 'age': 0}, inplace=True) # 按列填充
类型转换
# 转换列类型 df['age'] = df['age'].astype(int) df['date'] = pd.to_datetime(df['date']) # 优化内存 df['city'] = df['city'].astype('category') # 对低基数列节省内存
去重
df.drop_duplicates(subset=['name', 'city'], keep='first') # 保留第一个重复值
2.3 数据筛选
- 按列筛选:
df["Name"] # 选择单列 → Series df[["Name", "Age"]] # 选择多列 → DataFrame
- 按行筛选:
# 按位置选择 df.iloc[0] # 第0行 df.iloc[1:3] # 第1-2行 # 按条件筛选 df[df["Age"] > 25] # 年龄>25的行 df.query("Age > 25 & City == 'Paris'") # 使用 query 方法
选择数据
# 按列选择 df['name'] # 返回 Series df[['name', 'age']] # 返回 DataFrame # 按行选择 df.iloc[0] # 第0行(按位置) df.loc[df['age'] > 25] # 按条件筛选(返回年龄>25的行) # 混合选择(行+列) df.loc[df['age'] > 25, ['name', 'city']]
2.4 处理缺失值
# 检查缺失值
df.isnull().sum()
# 删除缺失值
df.dropna() # 删除包含缺失值的行
df.dropna(axis=1) # 删除包含缺失值的列
# 填充缺失值
df.fillna(0) # 用0填充
df["Age"].fillna(df["Age"].mean(), inplace=True) # 用均值填充
2.5 数据排序
# 按列排序
df.sort_values("Age", ascending=False) # 降序排列
# 多列排序
df.sort_values(["City", "Age"], ascending=[True, False])
2.6 添加/删除列
# 添加新列
df["Salary"] = [70000, 80000, 90000]
# 删除列
df.drop("City", axis=1, inplace=True)
新增/删除列
# 新增列 df['salary'] = [50000, 60000, 70000] # 基于计算新增列 df['age_plus_10'] = df['age'] + 10 # 删除列 df.drop(columns=['city'], inplace=True)
3. 数据分组与聚合
3.1 分组统计
# 按城市分组,计算平均年龄
df.groupby("City")["Age"].mean()
# 多级分组
df.groupby(["City", "Salary"]).agg({"Age": "mean", "Salary": "sum"})
3.2 聚合函数
# 对分组数据应用多种聚合
df.groupby("City").agg(
Avg_Age=("Age", "mean"),
Max_Salary=("Salary", "max")
)
数据透视表
# 类似 Excel 数据透视表 pd.pivot_table(df, values='salary', index='city', columns='gender', aggfunc='mean')
4. 数据合并
4.1 按列合并(JOIN)
df1 = pd.DataFrame({'id': [1, 2], 'name': ['A', 'B']})
df2 = pd.DataFrame({'id': [1, 2], 'salary': [100, 200]})
# 内连接
pd.merge(df1, df2, on='id', how='inner')
# 左连接
pd.merge(df1, df2, on='id', how='left')
4.2 按行合并(UNION)
pd.concat([df1, df2], axis=0) # 垂直堆叠(需列名一致)
5. 高级功能
5.1 应用函数
# 对列应用函数
df["Age_Squared"] = df["Age"].apply(lambda x: x ** 2)
# 对行应用函数
df.apply(lambda row: row["Salary"] / row["Age"], axis=1)
5.2 处理时间序列
# 转换为时间类型
df['date'] = pd.to_datetime(df['date'])
# 设置时间索引
df.set_index('date', inplace=True)
# 按时间重采样(例如按月统计)
df.resample('M').mean()
# 计算时间差
df['days_since_event'] = (pd.Timestamp.now() - df['date']).dt.days
6. 性能优化技巧
- 避免逐行操作:使用向量化操作(如
df["col"] * 2
)替代apply
。 - 使用高效数据类型:
df["Category"] = df["Category"].astype("category") # 节省内存
- 分块处理大数据:使用
chunksize
参数分块读取文件。
df['bonus'] = df['salary'] * 0.1 # 高效
chunks = pd.read_csv('large_data.csv', chunksize=10000)
for chunk in chunks:
process(chunk)
7. 实战场景示例
实战案例:销售数据分析
目标:统计每个地区的销售额和利润。
# 读取数据
sales = pd.read_csv('sales.csv', parse_dates=['order_date'])
# 清洗数据
sales.dropna(subset=['region', 'sales'], inplace=True)
sales['profit'] = sales['profit'].fillna(0)
# 分析
result = sales.groupby('region').agg(
total_sales=('sales', 'sum'),
avg_profit=('profit', 'mean')
).reset_index()
# 保存结果
result.to_csv('sales_summary.csv', index=False)