第二神器pandas库
1. Series
1.1 一种类似一维数组的对象
- 组成
index
values
1.2 Series(data=None, index=None, dtype=None, name=None,copy=False,fastpath=False)
Series(data=[1,2,3,4],index=list('ABCD'))
````Series({'A':1,'B':2,'C':3,'D':4})```
- 作用:创建Series数组
data指定values
index指定索引
name指定名字
1.3 索引和切片
-
显式索引
- 使用指定的索引
s['A']
- s.loc[]
s.loc['A':'C']
s.loc[['A','B']]
- 使用指定的索引
-
隐式索引
- 使用整数索引
s[0]
- s.iloc[]
s.iloc[::2]
- 使用整数索引
1.4 属性和方法
shape查看形状
size内容的个数
index查看索引
values查看内容
head()查看头几行数据
tail()查看末尾几行数据
unique()去重
1.5 空值
- None会转化为NaN,计算时当成0
- 检测
isnull()
notnull()
1.6 Series运算
- s + | * 4
加或乘 - Series之间
运算中自动对齐不同索引的数据
不对应用NaN补位
1.7 多重索引
Series(data,index=[['期中','期中','期末','期末'],['语文','数学','语文','数学']])
Series([100,90,80,70,60,50],index=pd.MultiIndex.from_product([['期中','期末'],['语','数','外']]))
1.8 多层索引的索引与切片
- 索引
s1.loc['期中','语']
s1.loc['期中'].loc['语']
- 切片
s1.loc['期中':'期末']
s1.iloc[0:4]
2. DataFrame
2.1 一个表格型数据结构
- 组成
index(行索引)
columns(列索引)
values(numpy的二维数组)
- 属性
columns
values
index
shape
2.2 创建
DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
data一个二维数组
index行索引--->列表
columns列索引--->列表
index=['张三','李四','王老五','zhaoliu','田七']
columns = ['python','java','c','math']
df = DataFrame(data=nd,index=index,columns=columns)
DataFrame(data={
'A':[1,2,3,4],
'B':[1,2,3,4],
'C':[1,2,3,4],
})
pd.read_csv('./data/president_heights.csv')
2.3 查找
.query(查询条件) :df1.query('name=="lucy"&age>14')
2.4 索引
- 列索引
字典式索引:df['python']
属性索引:df.python
- 行索引
.loc[]:df.loc['zhaoliu']
.iloc[]:df.iloc[3]
- 元素索引
需求:获取行张三,列python数据
df.loc['张三','python']
df.python.iloc[0]
df.iloc[0,0]
df.python.loc['张三']
df.loc['张三'].loc['python']
.loc 里面用字符串索引 df.loc['行名','列名']
.iloc 里面用编号 df.iloc[行索引,列索引]
2.5 切片
- 行切片
df['刘总':'学委']
df[0:3]
- 列切片
.loc ---- 使用index :df.loc[:,'韭菜':'臭豆腐']
.iloc---- 使用索引:df.iloc[:,0:3]
2.6 运算
和数值
直接加乘,也可使用索引对具体内容进行运算-
DataFrame之间
运算中自动对齐不同索引的数据
不对应用NaN补位
Python 操作符与pandas操作函数的对应表
Series与DataFrame之间
使用Python操作符:以行为单位操作(参数必须是行),对所有行都有效。(类似于numpy中二维数组与一维数组的运算,但可能出现NaN)
df1 + s2
使用pandas操作函数:
axis=0:以列为单位操作(参数必须是列),对所有列都有效。
axis=1:以行为单位操作(参数必须是行),对所有行都有效。
df1.add(s2,axis='index')
2.7 处理丢失数据
- None:python自带的数据类型,不参与计算
- np.NaN:结果为nan
np.nansum(nd)
此函数将nan视为0,进行计算 - 空值操作
isnull()
是nan
配合any()使用效果更佳
notnull()
不是nan
dropna()
: 删除有nan的行或列
参数:how='any|all'
fillna()
: 填充
参数:method {'backfill', 'bfill', 'pad', 'ffill', None}
从后面找值来填充nan 从前面找值来填充nan
参数:value指定填充的值
参数:limit限制填充nan的个数
参数:inplace是否替换原来的数据
参数:axis指定轴线
2.8 拼接操作
- 级联
会出现重复的行索引
pd.concat(objs, # obj指定拼接的对象
axis=0, # axis指定拼接控制方向
join='outer', # join指定拼接方式,outer外联方式,有的都要,inner保留相同的列
join_axes=None, # join_axes指定连接轴
ignore_index=False, # ignore_index指定是否重新生成索引
keys=None,
levels=None,
names=None,
verify_integrity=False,
sort=None, # sort指定对不上的列的填充
copy=True)
pd.append df5.append(df6)
- 合并
pd.merge
pd.merge(left, right,
how='inner',
on=None,
left_on=None, right_on=None,
left_index=False, right_index=False,
sort=False, suffixes=('_x', '_y'),
copy=True,
indicator=False,
validate=None)
- 一对一
都有的进行拼接 - 多对一
两个表都有的项目作乘积 - 多对多
使用on参数指定特征进行合并
pd.join
2.9 多层索引
-
多层行索引
pd.MultiIndex
- .from_arrays
indexes = pd.MultiIndex.from_arrays([['期中','期中','期中','期末','期末','期末'],['语','数','外','语','数','外']])
- .from_tuples
indexes = pd.MultiIndex.from_tuples([('期中','语'),('期中','数'),('期中','外'),('期末','语'),('期末','数'),('期末','外')])
- .from_product
indexes = pd.MultiIndex.from_product([['期中','期末'],['语','数','外']])
- .from_arrays
多层列索引
同多层行索引
2.10 多层索引的索引与切片
- 索引
df1['一班']
df1.loc['期中'].loc['语']
df1.loc['期中','语']
- 切片
df1.iloc[:,0:4]
df1.loc[:,'一班'].loc[:,'01':'02']
总结:要么用编号,要么用文字索引取的话就一级一级来吧(猥琐发育,别浪)
3. 读取外部表文件
read_csv
:读取csv文件,也可读取网上的csv文件,传入url
read_table
: 读取tsv文件
read_excel
: 读取xlsx文件
html,json
read_sql(sql, con)
: 读取数据库
sql指定数据库操作命令
con指定连接的数据库
4. 向外部输出
to_csv|table|json|html|excel...(path)
:
path指定输出路径及文件名
to_sql(table, con)
:
table指定输出的表名
con指定连接的数据库
5. 层次化索引
Series
DataFrame
6. 索引的堆(stack)
.stack()
参数:level指定把哪一层索引放下了
列索引脱衣服
unstack()
参数:level指定把哪一层索引放下了
行索引脱衣服
7. 数据处理
重复元素
df.duplicated(subset=None, keep='first')
keep指定第一个不参与重复判断 first | last | False
df.duplicated(keep=False)
df.drop_duplicates(subset=None, keep='first', inplace=False)
keep指定保留第一个不删除 first | last | False
df.drop_duplicates(keep=False)
8.映射
8.1 Series
-
替换元素
- 单值
- 普通
s1.replace(to_replace='beijing',value='西安')
- 字典
s1.replace(to_replace={'beijing':'西安'})
- 普通
- 多值
- 列表
s1.replace(to_replace=[100,np.nan],value=['满分','缺考'])
- 字典
s1.replace(to_replace={100:'满分',np.nan:'缺考','beijing':'西安','没有的':'也不会报错'})
- 列表
- 单值
df.replace(to_replace=None,
value=None,
inplace=False,
limit=None,
regex=False,
method='pad')
应用:可以用来做过滤器
8.2 DataFrame
-
替换元素
- 单值
- 普通
df.replace(to_replace='Beijing',value='西安')
- 指定列的单值替换
df.replace(to_replace={4:'Beijing'},value='西安')
- 普通
- 多值
- 列表
df.replace(to_replace=['甲','乙',np.nan],value=[1,2,'空值'])
- 字典
df.replace(to_replace={'甲':1,'乙':2,np.nan:'空值','Beijing':'西安','不存在的也可以放这里':'不会报错'})
- 列表
- 单值
df.replace(to_replace=None,
value=None,
inplace=False,
limit=None,
regex=False,
method='pad')
应用:可以用来做过滤器
- map函数
- map(字典) 字典的键要足以匹配所有的数据,否则出现NaN
- map(lambda)中可以使用lambd表达式
- map(func)中可以使用方法,可以是自定义的方法
- rename函数
- 使用rename()函数替换行索引
- index 替换行索引
- columns 替换列索引
- level 指定多维索引的维度
9.数据检测过滤
思路:查看概览,列标准差,列平均值,获取每个值和平均值的差的绝对值,和列标准差的3倍比较,获取行异常数据,删除
1) . df.describe() # 对表格数据进行描述性概览
2) . df.std() # 对每一列 求 标准差 获取到的是 Series
3). df.mean()
4). np.abs(df-df.mean())
5). np.abs(df-df.mean()) > 3*df.std()
6). (np.abs(df-df.mean()) > 3*df.std()).any(axis=1) -----(np.abs(df-df.mean()) > 3*df.std()).any()
7). df[(np.abs(df-df.mean()) > 3*df.std()).any(axis=1)]
8). idx = df[(np.abs(df-df.mean()) > 3*df.std()).any(axis=1)].index
9). df.drop(labels=idx)
10. 排序
- take()函数接受一个索引列表,用数字表示
df.take([1,3,4,2,5])
- 顺序打乱,但不会重复
np.random.permutation(5)
可作为take的索引列表
11. 数据分类处理
数据分类处理
- 分组:先把数据分为几组
- 合并:把不同组得到的结果合并起来
merge合并
- 用函数处理:为不同组的数据应用不同的函数以转换数据
groupby()函数
: 分组函数 - groups属性查看分组情况
需求:根据item分组,通过groups属性查看结果
df.groupby('item').groups
12.透视表
理解为表分组展示数据
pd.pivot_table(data,
values=None,
index=None,
columns=None,
aggfunc='mean',
fill_value=None,
margins=False,
dropna=True,
margins_name='All')
13. 交叉表
理解为表头分栏
pd.crosstab(index,
columns,
values=None,
rownames=None,
colnames=None,
aggfunc=None,
margins=False,
margins_name='All',
dropna=True,
normalize=False)
###