Python-Pandas基础
一、Pandas核心数据结构
1. Series(一维数组)
创建方法:
# 从列表创建 s = pd.Series([1, 3, 5, np.nan], index=['a','b','c','d'])# 从字典创建(自动使用键作为索引) s = pd.Series({'A':90, 'B':85, 'C':92})
核心属性:
属性
说明
示例
s.index
索引对象
Index(['a','b','c','d'])
s.values
值数组
array([1,3,5,nan])
s.dtype
数据类型
float64
s.shape
数据形状
(4,)
s.size
元素数量
4
2. DataFrame(二维表格)
创建方法:
# 从字典创建(最常用) data = {'姓名':['张三','李四'], '年龄':[25,30], '城市':['北京','上海']} df = pd.DataFrame(data)# 指定列顺序和索引 df = pd.DataFrame(data, columns=['姓名','城市','年龄'], index=['a','b'])
核心属性:
属性
说明
示例
df.index
行索引
Index(['a','b'])
df.columns
列名
Index(['姓名','年龄','城市'])
df.shape
表格形状
(2,3)
df.dtypes
每列数据类型
姓名:object, 年龄:int64...
df.values
二维数组
array([['张三',25,'北京'],...])
二、Series常用操作详解
1. 统计方法:
s = pd.Series([3, 5, 2, 4, 4, 3])s.mean() # 平均值 → 3.5
s.median() # 中位数 → 3.5
s.mode() # 众数 → [3,4]
s.std() # 标准差 → 1.048
s.min() # 最小值 → 2
s.argmax() # 最大值位置 → 1
s.value_counts()# 值计数 → 4:2, 3:2, 2:1
s.describe() # 描述性统计(计数/均值/标准差/四分位等)
2. 布尔索引:
# 筛选大于平均值的元素
s[s > s.mean()] # → [5,4,4]# 多条件筛选(&代替and,|代替or)
s[(s > 2) & (s < 5)] # → [3,4,4,3]
3. 向量化运算:
s * 2 # 所有元素乘2 → [6,10,4,8,8,6]
s + pd.Series([10,20], index=[0,1]) # 索引对齐运算 → [13,25,NaN,NaN...]
np.log(s) # 应用NumPy函数
三、DataFrame常用操作详解
1. 数据选取:
# 列选取
df['姓名'] # 获取单列 → Series
df[['姓名','年龄']] # 多列 → DataFrame# 行选取
df.loc['a'] # 按索引选行 → Series
df.iloc[0] # 按位置选行 → Series
df[0:1] # 切片选行 → DataFrame# 单元格选取
df.at['a','年龄'] # 25(快速访问标量)
df.loc['a','城市'] # '北京'
2. 布尔索引:
# 筛选北京居民
df[df['城市'] == '北京'] # 复合条件(年龄>25且来自上海)
df[(df['年龄'] > 25) & (df['城市'] == '上海')]
3. 统计方法:
df.mean() # 每列均值(数值列)
df.max() # 每列最大值
df.idxmax() # 最大值所在行索引
df.corr() # 列间相关系数矩阵
df['年龄'].corr(df['分数']) # 两列相关系数
四、数据结构更改指南
1. 索引操作:
# 设置索引
df.set_index('姓名', inplace=True) # 设置姓名列为索引# 重置索引
df.reset_index(drop=True) # 删除原索引(不保留)# 重命名索引/列名
df.rename(index={'张三':'员工1'}, columns={'年龄':'Age'})
2. 列操作:
# 添加新列
df['薪资'] = [15000, 18000] # 删除列
df.drop('城市', axis=1, inplace=True)# 插入列(在位置1插入)
df.insert(1, '部门', ['技术部','市场部'])
3. 数据类型转换:
df['年龄'] = df['年龄'].astype(float) # 转为浮点型
pd.to_datetime(df['日期列']) # 转为日期类型
五、数据导入导出大全
1. CSV文件:
# 读取(含参数详解)
df = pd.read_csv('data.csv', encoding='utf-8', # 编码格式index_col=0, # 指定索引列na_values=['NA']) # 缺失值标识# 保存(含参数详解)
df.to_csv('output.csv', index=False, # 不保存索引encoding='gbk', # 中文编码columns=['姓名','年龄']) # 只存指定列
2. Excel文件:
# 读取(需安装openpyxl)
df = pd.read_excel('data.xlsx', sheet_name='Sheet1',header=0) # 第一行为列名# 保存(需安装xlsxwriter)
df.to_excel('output.xlsx', sheet_name='结果',float_format='%.2f') # 浮点数格式
3. Pickle文件(Python专用):
# 保存(保留数据类型)
df.to_pickle('data.pkl') # 读取
df = pd.read_pickle('data.pkl')
4. 其他格式:
# SQL数据库
from sqlalchemy import create_engine
engine = create_engine('sqlite:///mydb.db')
pd.read_sql('SELECT * FROM table', engine)# JSON格式
df.to_json('data.json', orient='records')
pd.read_json('data.json')
💡 关键要点总结
数据结构选择:
单列数据 →
Series
多列表格 →
DataFrame
数据处理黄金法则:
# 替代循环的向量化操作(速度快100倍) df['新列'] = df['列1'] * 2 + df['列2']
性能优化技巧:
读取大文件时使用
chunksize
参数分块处理减少
inplace=True
的使用(创建副本更安全)使用
category
类型处理有限个数的字符串列(节约内存)
最佳实践:
# 标准化数据处理流程 df = (pd.read_csv('raw_data.csv').rename(columns=str.lower) # 列名小写.dropna(subset=['关键列']) # 删除关键列缺失行.reset_index(drop=True) # 重置索引.astype({'年龄':'int'})) # 类型转换
注:所有代码示例建议在Jupyter Notebook中运行测试,实践中学习效果最佳!