Pandas基本操作
简介
- 表格数据操作(增删改查)
- 实现多个表格的处理
- 数据清洗操作:缺失值,重复值,异常值,数据标准化,数据转化的操作
- 实现excel的特殊操作:生成透视表,交叉表
- 完成统计分析
一:构建dataframe
dataframe同时拥有行索引和列索引,所以它是二维的
导入模块
import pandas as pd
构建dataframe方法一
columns:列索引
index:行索引,可以不写,会自动以数字补全
data:表格中的值
df1 = pd.DataFrame(data=[["kid",20,"男","it"],["hacker",23,"男","skate"],["hero",4,"女","games"]], index=["a","b","c"],columns=["姓>名","年龄","性别","爱好"])
print(df1)
# 结果
姓名 年龄 性别 爱好
a kid 20 男 it
b hacker 23 男 skate
c hero 4 女 games
构建dataframe方法二
以键值对方式创建
df2 = pd.DataFrame(data={"姓名":["gboy","bgril"],"年龄":[29,18],"性
别":["男","女"],"weight":[127,98]})
print(df2)
# 结果
姓名 年龄 性别 weight
0 gboy 29 男 127
1 bgril 18 女 98
二:dataframe属性
-
shape
结构
print(df1.shape) # 结果 (3, 4)
-
ndim
维度
print(df1.ndim) # 结果 2
-
size
元素个数
print(df1.size) # 结果 12
-
dtypes
元素类型,查看每一列数据的类型
print(df1.dtypes) # 结果 姓名 object 年龄 int64 性别 object 爱好 object dtype: object
-
columns
查看列索引
print(df1.columns) # 结果 Index(['姓名', '年龄', '性别', '爱好'], dtype='object')
-
index
查看行索引
print(df1.index) # 结果 Index(['a', 'b', 'c'], dtype='object')
-
values
查看元素,返回的是一个数组类型
print(df1.values) # 结果 [['kid' 20 '男' 'it'] ['hacker' 23 '男' 'skate'] ['hero' 4 '女' 'games']]
三:查找方法
-
一维切片
返回的是series类型,series是一维类型,只有一个轴
仅限于取一列的值,切多列值时需传入一个列表
print(df1["姓名"]) # 结果 a kid b hacker c hero Name: 姓名, dtype: object
-
二维切片
切多列值,返回的是frame类型,frame是一个二维类型,有两个轴
print(df1[["姓名","年龄"]]) # 结果 姓名 年龄 a kid 20 b hacker 23 c hero 4
取某一行
只能进行正序切片,后序切片即[:-1]的写法是错误的
df1[["姓名","年龄"]][:2] # 结果 姓名 年龄 a kid 20 b hacker 23
-
索引切片
loc[行索引名称/条件, 列的索引名称]
如果loc[]中有一个[]或没有[]则得到一维类型,如果loc[]中有两个[]则得到二维类型
- 切出单个值,得到的为一维类型
print(df1.loc["a","姓名"])
- 单行切分,得到的为一维类型
print(df1.loc["a",:]) # 结果 姓名 kid 年龄 20 性别 男 爱好 it Name: a, dtype: object
- 多行切分,得到的为二维类型
print(df1.loc[["a","b"],["姓名","年龄"]]) # 结果 姓名 年龄 a kid 20 b hacker 23
-
条件切分
这里的:b是指从头开始取,取到行索引为3的值停止,所以使用条件切分时要注意打乱顺序的表格取值,取值为前闭后闭
print(df1.loc[:"b","姓名"]) # 结果 a kid b hacker Name: 姓名, dtype: object
-
条件取值
例:获取年龄大于18岁的男同学的姓名和爱好
位运算(对位运算):& 和 |,&表示和,|表示或
mask1 = df1["年龄"] > 18 mask2 = df1["性别"] == "男" mask = mask1 & mask2 print(df1.loc[mask,["姓名","爱好"]]) # 结果 姓名 爱好 a kid it b hacker skate
-
iloc取值(不常用)
按索引取值
# 取最后一行 print(df1.iloc[-1,:]) # 结果 姓名 hero 年龄 4 性别 女 爱好 games Name: c, dtype: object
四:增加方法
-
增加一列
如果没有这一列则添加,如果有这一列则覆盖。如果只赋值一个元素则会先进行广播,然后再增加。
# 为每个人添加身高 df1["height"] = [178,167,181] print(df1) # 结果 姓名 年龄 性别 爱好 height a kid 20 男 it 178 b hacker 23 男 skate 167 c hero 4 女 games 181
-
append
增加行数
原表并不会改变,而是在增加后返回一个新表
增加行数时,列索引会取两个表的交集,元素不存在的地方则用NaN填充,行索引为两个表的行索引
df3 = df1.append(df2) print(df3) # 结果 姓名 年龄 性别 爱好 height weight a kid 20 男 it 178.0 NaN b hacker 23 男 skate 167.0 NaN c hero 4 女 games 181.0 NaN 0 gboy 29 男 NaN NaN 127.0 1 bgril 18 女 NaN NaN 98.0
ignore_index=True:表示忽略原始行索引,重新设置行索引
df4 = df1.append(df2,ignore_index=True) print(df4) # 结果 姓名 年龄 性别 爱好 height weight 0 kid 20 男 it 178.0 NaN 1 hacker 23 男 skate 167.0 NaN 2 hero 4 女 games 181.0 NaN 3 gboy 29 男 NaN NaN 127.0 4 bgril 18 女 NaN NaN 98.0
五:删除方法
drop
labels:要删除的列/行索引
- 删除指定列
不会在原表上进行修改,会放回一个新表,如果想将修改直接反映在原表中,则需指定参数:inplace=True
print(df4.drop(labels=["height","weight"],axis=1))
# 结果
姓名 年龄 性别 爱好
0 kid 20 男 it
1 hacker 23 男 skate
2 hero 4 女 games
3 gboy 29 男 NaN
4 bgril 18 女 NaN
- 删除指定行
print(df4.drop(labels=[3],axis=0))
# 结果
姓名 年龄 性别 爱好 height weight
0 kid 20 男 it 178.0 NaN
1 hacker 23 男 skate 167.0 NaN
2 hero 4 女 games 181.0 NaN
3 gboy 29 男 NaN NaN 127.0
六:修改方法
先将要修改的值查出来,然后再修改
例:将名字为"hacker"的人的性别改为"女"
df1.loc[df1["姓名"]=="hacker","性别"] = "女"
print(df1)
# 结果
姓名 年龄 性别 爱好 height
a kid 20 男 it 178
b hacker 23 女 skate 167
c hero 4 女 games 181
七:统计方法
-
沿用numpy中的10个统计分析方法,可翻看以前博客,这里不做讲解
补充:极差,最大值与最小值差
np.ptp(df1["年龄"])
-
pandas中的方法
-
针对series类型,即一维类型
二维类型的方法一维都能使用,一维的方法二维不一定能够使用
将numpy的方法转换为pandas的方法,写法如下
# 取某一列的最小数 print(df1["年龄"].min()) # --> 4 # 取标准差 print(df1["年龄"].std()) # --> 10.214368964029708 # 取最大值索引 print(df1["年龄"].argmax()) # --> 1 ...
补充方法:
众数,出现次数最多的数
print(df1["年龄"].mode()) # 结果 0 4 1 20 2 23 dtype: int64
非空数
print(df1["年龄"].count() ) # 结果 3
频数统计,一维特有方法
print(df1["年龄"].value_counts()) # 结果 20 1 4 1 23 1 Name: 年龄, dtype: int64
-
df类型方法
取最小数
取出的是每一列的最小值,字符串按照编码排序,得到的为一维类型
print(df1.min()) 姓名 hacker 年龄 4 性别 女 爱好 games height 167 dtype: object
最大值索引,横向比较
print(df2[["年龄","weight"]].idxmax(axis=1)) # 结果 0 weight 1 weight dtype: object
最大值索引比较,纵向比较
print(df2[["年龄","weight"]].idxmax(axis=0)) # 结果 年龄 0 weight 0 dtype: int64
众数
每一列中,只显示众数,其它位置都用NaN补充
print(df1.mode()) # 结果 姓名 年龄 性别 爱好 height 0 hacker 4 女 games 167 1 hero 20 NaN it 178 2 kid 23 NaN skate 181
描述
- 整数类型,如果字符串类型与整数类型混用,则只返回整数类型的描述
print(df1["年龄"].describe()) # 结果 年龄 count 3.000000 mean 15.666667 std 10.214369 min 4.000000 25% 12.000000 50% 20.000000 75% 21.500000 max 23.000000
-
字符串类型
count:非空数目
unique:去重之后又几个值
top:众数
freq:众数出现的频数
print(df1["性别"].describe()) # 结果 count 3 unique 2 top 女 freq 2 Name: 性别, dtype: object
-
附:补充
一维series构建
pd.Series(data=[“lx”,“ss”,“zs”],index=[0,1,2])