1. 数据结构
Pandas主要有三种数据结构:
一维数列:Series
二维表格:DataFrame
三维板块:Panel
对应成excel,Series就是A列,Dataframe就是sheet,Panel就是多个sheet的表格
2. 查改增删
pandas查改增删需要先索引定位,有两种方式,at为快捷形式
标签索引:loc / at
位置索引:iloc / iat
2.1 数据查询
transcript = {'姓名': ['张三', '李四'], '成绩': [90, 60]}
df = pd.DataFrame(transcript)
running results:
姓名 成绩
0 张三 90
1 李四 60
# 数据索引
df.loc[1, '姓名']
df.iloc[1, 0]
running results:
李四
李四
2.2 数据修改
# 单值修改
df.loc[1, '姓名'] = '王五'
df.iloc[1, 0] = '王五'
running results:
姓名 成绩
0 张三 90
1 王五 60
# 整列修改
df['成绩'] = [70, 50]
running results:
姓名 成绩
0 张三 70
1 李四 50
2.3 数据增加
df['性别'] = ['男', '女']
df.loc[2] = ['王五', 50, '男']
running results:
姓名 成绩 性别
0 张三 90 男
1 李四 60 女
2 王五 50 男
2.4 数据删除
df.drop('性别', axis=1, inplace=True)
running results:
姓名 成绩
0 张三 90
1 李四 60
2 王五 50
2.5 条件判断
df['姓名'].isin(['王五'])
running results:
0 False
1 False
2 True
2.6 条件筛选
# 范围筛选
df = df[df['成绩'] > 70]
running results:
姓名 成绩 性别
0 张三 90 男
3. 常用功能
3.1 常用函数
常用函数 | 解释:【重要参数】 |
detypes | 返回数据类型 |
astype | 转换数据类型:int / float / bool / datetime64 |
shape | 返回数据维度 |
empty | 判断是否为空 |
dropna | 删除空值 |
fillna | 填充空值:【method】向下 ffill / 向上 bfill【limit】最大填充几行 |
count | 返回非nan单元格个数 |
first_valid_index | 返回第一个非nan的索引 |
last_valid_index | 返回最后一个非nan的索引 |
index / columns | 行 / 列 |
rename | 重命名行 / 列 |
unique | 返回唯一值 |
set_index | 将一个或多个现有列作为索引 |
reset_index | 重置索引 |
head / tail | 返回前n行 / 后n行 |
apply | 应用函数 |
rolling | 滚动计算 |
shift | 向期望方向移动n行 |
where | 根据条件筛选替换 |
read_excel / read_csv | 读取excel / csv |
to_excel / to_csv | 存入excel / csv |
统计函数 | 解释 |
describe | 生成统计描述 |
max / min | 最大值 / 最小值 |
idxmax / idxmin | 最大值 / 最小值 位置索引 |
mean / median | 平均值 / 中位数 |
var / std | 方差 / 标准差 |
cumsum / cumprod | 累计和 / 累计积 |
cummax / cummin | 累计最大 / 累计最小 |
quantile | 样本分位数(0,1) |
pct_change | 百分变化数 |
mode | 众数 |
3.2 空值处理
transcript = {'姓名': ['张三', '李四'],
'成绩': [90, np.nan]}
df = pd.DataFrame(transcript)
# 空值补充:将没有成绩的科目分数补0
df.fillna(0, inplace=True)
running results:
姓名 成绩
0 张三 90.0
1 李四 0.0
3.3 数据替换
transcript = {'姓名': ['张三*', '李四*'],
'性别': ['男', '女']}
df = pd.DataFrame(transcript)
running results:
姓名 性别
0 张三* 男
1 李四* 女
# 数据替换:将名字后的*去掉,并且将"男女"改为"男生"和"女生"
df['姓名'] = df['姓名'].str.replace('*', '', regex=False)
df['性别'] = df['性别'].replace(['男', '女'], ['男生', '女生'])
running results:
姓名 性别
0 张三 男生
1 李四 女生
4. 常用操作
4.1 映射操作
主要有三个函数:map、apply、applymap
函数 | 应用对象 | 接受字典 | 接受函数 | 其它形式 |
map | Series | ■ | ■ | □ |
apply | 通用 | □ | ■ | ■ |
applymap | DataFrame | 对整个DataFrame进行apply操作 |
# map映射:将"男女"用"1和0"代替
gender = {'男': 1, '女': 0}
df['性别'] = df['性别'].map(gender)
running results:
姓名 成绩 性别
0 张三 90 1
1 李四 60 0
2 王五 50 1
# apply映射:将成绩用"优"和"良"代替
df['评价'] = df['成绩'].apply(lambda x: '优' if x > 80 else '良')
running results:
姓名 成绩 性别 评价
0 张三 90 男 优
1 李四 60 女 良
2 王五 50 男 良
4.2 排序操作
主要有三个函数:rank、sort_values、sort_index
# rank为沿轴计算数值等级
df['排名'] = df['成绩'].rank(ascending=False)
running results:
姓名 成绩 性别 排名
0 张三 90 男 1.0
1 李四 60 女 2.0
2 王五 50 男 3.0
# sort_values为按值排序,默认升序
df.sort_values('成绩', inplace=True)
# sort_index为按索引排序
df.sort_index(ascending=False, inplace=True)
running results:
姓名 成绩 性别
2 王五 50 男
1 李四 60 女
0 张三 90 男
4.3 合并操作
主要有两个函数:concat、merge
concat沿着某个方向去拼接,主要参数:
axis : axis = 0
join : "outer"
ignore_index : False
keys : None
class1 = {'姓名': ['张三', '李四'], '成绩': [90, 60], '性别': ['男', '女']}
class2 = {'姓名': ['王五', '赵六'], '成绩': [80, 70], '性别': ['男', '女']}
df1 = pd.DataFrame(class1)
df2 = pd.DataFrame(class2)
# 数据拼接
df = pd.concat([df1, df2])
running results:
姓名 成绩 性别
0 张三 90 男
1 李四 60 女
0 王五 80 男
1 赵六 70 女
merge按照共有值去拼接,主要参数:
left : DataFrame | Series,
right : DataFrame | Series
on : IndexLabel | None = None
how : "inner"
left_on : None
right_on : None
left_index : False
right_index : False
info1 = {'姓名': ['张三', '李四'], '成绩': [90, 60]}
info2 = {'姓名': ['张三', '李四'], '性别': ['男', '女']}
df1 = pd.DataFrame(info1)
df2 = pd.DataFrame(info2)
# 数据拼接
df = pd.merge(df1, df2, on='姓名')
running results:
姓名 成绩 性别
0 张三 90 男
1 李四 60 女
4.4 透视操作
主要有两个函数:pivot(仅透视)、pivot_table(透视+计算)
transcript = {'姓名': ['张三', '李四', '张三', '李四'],
'科目': ['语文', '语文', '数学', '数学'],
'成绩': [90, 60, 80, 70]}
df = pd.DataFrame(transcript)
running results:
姓名 科目 成绩
0 张三 语文 90
1 李四 语文 60
2 张三 数学 80
3 李四 数学 70
# pivot透视
df = df.pivot(index='姓名', columns='科目', values='成绩')
running results:
科目 数学 语文
姓名
张三 80 90
李四 70 60
# pivot_table透视
df = df.pivot_table(index='姓名', values='成绩', aggfunc='sum')
running results:
成绩
姓名
张三 170
李四 130
4.5 分组操作
主要为函数groupby,groupby后会变成DataFrameGroupBy格式,直接打印仅显示内存地址
# 分组操作:接前文的数据定义
grouped = df.groupby(by='科目')
for course, group in grouped:
print(course)
print(group)
running results:
数学
姓名 科目 成绩
2 张三 数学 80
3 李四 数学 70
语文
姓名 科目 成绩
0 张三 语文 90
1 李四 语文 60
4.6 重塑操作
主要有两个函数:stack和unstack
# 数据定义
transcript = {'姓名': ['张三', '李四'],
'成绩': [90, 60]}
df = pd.DataFrame(transcript)
running results:
姓名 成绩
0 张三 90
1 李四 60
# 堆栈操作:将数据的列旋转成行,AB由列属性变成行索引
df = df.stack()
running results:
0 姓名 张三
成绩 90
1 姓名 李四
成绩 60
# 重置索引
df.reset_index(drop=True, inplace=True)
running results:
0 张三
1 90
2 李四
3 60
# 展开操作:将数据的行旋转成列,AB由行索引变成列属性
df = df.unstack()
running results:
姓名 0 张三
1 李四
成绩 0 90
1 60
# 重置索引
df.reset_index(drop=True, inplace=True)
running results:
0 张三
1 李四
2 90
3 60
5. 总结
本文主要是为了方便使用者快速定位解决简单问题,每一个函数还有很多参数可以设置,不同的函数之间还可以组合使用,以满足更复杂的需求。