“DataFrame 就像 Excel + SQL + Python 的孩子,天生会玩数据。”
📦 一、导入与基础
import pandas as pd
import numpy as np
读取文件
pd.read_csv('data.csv') # 读取 CSV
pd.read_excel('data.xlsx', sheet_name=0)
pd.read_json('data.json')
写出文件
df.to_csv('out.csv', index=False)
df.to_excel('out.xlsx', index=False)
查看信息
df.head(5) # 前5行
df.tail(3) # 后3行
df.shape # 行数, 列数
df.info() # 概要信息
df.describe() # 统计摘要
df.dtypes # 各列类型
df.columns # 列名
🔍 二、选择与索引
按列取值
df['col'] # 单列(Series)
df[['col1', 'col2']] # 多列(DataFrame)
按行 / 标签 / 位置
df.loc[2] # 取索引标签为2的行
df.iloc[2] # 取第3行
df.loc[2:5, ['A','B']] # 按标签选
df.iloc[:3, :2] # 按位置选
条件过滤
df[df['age'] > 30]
df[(df['age']>30) & (df['city']=='Beijing')]
df[df['name'].str.contains('Li')]
排序
df.sort_values('age', ascending=False)
df.sort_index(ascending=True)
🧱 三、列操作
df['new'] = df['A'] + df['B'] # 新列 = A + B
df['log'] = np.log1p(df['value']) # 对数变换
df.drop('col', axis=1, inplace=True) # 删除列
df.rename(columns={'old':'new'}) # 重命名
df['age'] = df['age'].astype(int) # 类型转换
🕳 四、缺失值处理
检测
df.isnull().sum() # 每列缺失个数
df.notnull() # 非缺失
填充
df['col'].fillna(0)
df.fillna(df.mean()) # 均值填充
df.fillna({'age':30})
df.ffill() # 前向填补
df.bfill() # 后向填补
删除
df.dropna() # 删除含缺失的行
df.dropna(axis=1) # 删除含缺失的列
🔁 五、重复与唯一
df.duplicated() # 检测重复
df.drop_duplicates() # 删除重复行
df['col'].unique() # 唯一值
df['col'].nunique() # 唯一个数
📊 六、分组与聚合
df.groupby('city')['income'].mean()
df.groupby(['city','gender']).agg({'age':'mean','income':'sum'})
df.groupby('dept').size() # 计数
命名聚合结果
df.groupby('city').agg(
avg_age=('age','mean'),
total_income=('income','sum')
)
🔗 七、合并与拼接
concat 拼接
pd.concat([df1, df2], axis=0) # 按行拼
pd.concat([df1, df2], axis=1) # 按列拼
merge 合并(类 SQL)
pd.merge(df1, df2, on='id', how='left')
join 合并(按索引)
df1.join(df2, how='inner')
📈 八、透视表 / 交叉表
pd.pivot_table(df, values='sales',
index='city', columns='year',
aggfunc='sum')
pd.crosstab(df['gender'], df['city'])
🧩 九、字符串操作(str)
df['name'].str.lower()
df['name'].str.strip()
df['email'].str.split('@').str[1]
df['city'].str.contains('Bei')
df['id'].str.replace('-','')
🕒 十、日期时间操作
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['weekday'] = df['date'].dt.dayofweek
df['is_weekend'] = (df['weekday']>=5).astype(int)
重采样
df.resample('M').mean() # 月均值
df.resample('W').sum() # 周和
🧮 十一、统计分析
df['age'].mean()
df['salary'].median()
df['city'].value_counts()
df.corr() # 相关矩阵
df['income'].quantile(0.9)
df['score'].clip(0,100)
🧠 十二、apply / map / lambda
df['double'] = df['age'].apply(lambda x: x*2)
df['code'] = df['city'].map({'Beijing':1, 'Shanghai':2})
df.apply(np.sum, axis=0) # 对列求和
💾 十三、导出保存
df.to_csv('result.csv', index=False)
df.to_excel('result.xlsx')
df.to_json('data.json', orient='records')
⚙️ 十四、实用技巧
df.memory_usage(deep=True) # 内存使用
df.astype({'col':'category'}) # 转为分类类型
df.query('age>30 and city=="Beijing"') # 类SQL查询
df.sample(frac=0.1, random_state=1) # 抽样10%
df.nlargest(5, 'salary') # 前5名
🎨 十五、快速可视化
df['age'].plot.hist(bins=20)
df.plot.scatter(x='age', y='income')
df.groupby('city')['salary'].mean().plot(kind='bar')
🧭 十六、典型工作流
# 1. 读入数据
df = pd.read_csv('data.csv')
# 2. 检查数据
df.info(); df.describe()
# 3. 缺失/异常处理
df.fillna(df.median(), inplace=True)
df = df[df['age'] < 90]
# 4. 特征工程
df['income_log'] = np.log1p(df['income'])
df['age_group'] = pd.cut(df['age'], bins=[0,18,35,60,120], labels=False)
# 5. 聚合统计
summary = df.groupby('city')['income'].agg(['mean','max','count'])
# 6. 可视化结果
summary['mean'].plot(kind='bar')
✨ 小贴士
loc
用标签,iloc
用位置。inplace=True
会原地修改,不返回副本。- Pandas 对 列操作快,对行循环慢。
- 链式赋值(
df['x'][mask] = ...
)要小心,会触发警告。 - 用
df.query()
/df.eval()
能让表达式更简洁、性能更好。