数据分析-02

第二神器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操作函数的对应表


    数据分析-02_第1张图片
    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([['期中','期末'],['语','数','外']])
  • 多层列索引
    同多层行索引

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
  • 替换元素

    1. 单值
      • 普通
        s1.replace(to_replace='beijing',value='西安')
      • 字典
        s1.replace(to_replace={'beijing':'西安'})
    2. 多值
      • 列表
        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
  • 替换元素

    1. 单值
      • 普通
        df.replace(to_replace='Beijing',value='西安')
      • 指定列的单值替换
        df.replace(to_replace={4:'Beijing'},value='西安')
    2. 多值
      • 列表
        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函数
    1. map(字典) 字典的键要足以匹配所有的数据,否则出现NaN
    2. map(lambda)中可以使用lambd表达式
    3. map(func)中可以使用方法,可以是自定义的方法
  • rename函数
    1. 使用rename()函数替换行索引
    2. index 替换行索引
    3. columns 替换列索引
    4. 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)
        
###

你可能感兴趣的:(数据分析-02)