数据分析——从入门到精通(六)

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

练习

  • 假设a是期中考试成绩,b是期末考试成绩,请自由创建b,并将其与a相加,求期中期末的平均值
  • 假设张三期中考试数学被发现作弊,要记为0分,如何实现?
  • 张六因为举报张三作弊有功,期中考试所有科目成绩加5分,如何实现?
  • 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生a的科目都加20分,如何实现?
  • 张二的语文,张四的物理,张六的地理未考,设置为NAN(注意:0和NAN不一样)
# 科目
columns = ['语文','数学','英语','物理','化学','生物','历史','地理']
# 索引
index =['张一','张二','张三','张四','张五','张六']
# 在1-150之间,创建六行八列
a = DataFrame(np.random.randint(1,151,size=(6,8)),index,columns,dtype=int)
a
语文数学英语物理化学生物历史地理
张一1332368105601449042
张二95113514614213062148
张三312838115425011359
张四614786145124733466
张五6794216473444100
张六79759812151104141145
# 创建b,期末考试成绩
b = DataFrame(np.random.randint(1,151,size=(6,8)),index,columns,dtype=int)
b
语文数学英语物理化学生物历史地理
张一9571485149594544
张二55214910310486564
张三73335575511811126
张四7813090135375712594
张五7566393926165355
张六1368169661741241
# 把期中成绩a和期末成绩b相加,算平均成绩
average = (a+b)/2
average
语文数学英语物理化学生物历史地理
张一114.015.0108.055.0104.5101.567.543.0
张二75.011.092.0124.5123.0108.059.076.0
张三19.030.536.586.048.584.0112.042.5
张四42.0138.588.0140.080.565.079.580.0
张五71.037.540.527.536.525.048.577.5
张六46.071.557.0108.556.089.0132.573.0
# 假设张三期中考试数学被发现作弊,要记为0分,如何实现?
# 期中考试成绩a
a
语文数学英语物理化学生物历史地理
张一1332368105601449042
张二95113514614213062148
张三312838115425011359
张四614786145124733466
张五6794216473444100
张六79759812151104141145
# 张三期中考试数学被发现作弊,要记为0分 ——方式一
a.loc['张三','数学'] = 0
a
语文数学英语物理化学生物历史地理
张一1332368105601449042
张二95113514614213062148
张三31038115425011359
张四614786145124733466
张五6794216473444100
张六79759812151104141145
# 张三期中考试数学被发现作弊,要记为0分 ——方式二
# - 隐式索引
# - df.iloc[行索引位置,列索引位置]  # 两个位置中间都可以进行索引操作
a.loc['张三','数学'] = 66
a
语文数学英语物理化学生物历史地理
张一1332368105601449042
张二95113514614213062148
张三316638115425011359
张四614786145124733466
张五6794216473444100
张六79759812151104141145
# 张三期中考试数学被发现作弊,要记为0分 ——方式二
a.iloc[2,1] = 0
a
语文数学英语物理化学生物历史地理
张一1332368105601449042
张二95113514614213062148
张三31038115425011359
张四614786145124733466
张五6794216473444100
张六79759812151104141145
# 张六因为举报张三作弊有功,期中考试所有科目成绩加5分,如何实现?
a.loc['张六'] += 5
a
语文数学英语物理化学生物历史地理
张一1332368105601449042
张二95113514614213062148
张三31038115425011359
张四614786145124733466
张五6794216473444100
张六898510813161114151155
a
语文数学英语物理化学生物历史地理
张一1736310814510018413082
张二13541175186182170102188
张三714078155829015399
张四4618712618516411374106
张五107498256877484140
张六129125148171101154191195
#  后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生科目都加20分,如何实现?
a +=20
a
语文数学英语物理化学生物历史地理
张一213103148185140224170122
张二17581215226222210142228
张三11180118195122130193139
张四86227166225204153114146
张五1478912296127114124180
张六169165188211141194231235
# 张二的语文,张四的物理,张六的地理未考,设置为NAN(注意:0和NAN不一样)
# 【注意】:不连续选择元素标签时,loc()支持
a.loc[['张二','张四','张六']]
语文数学英语物理化学生物历史地理
张二17581215226222210142228
张四86227166225204153114146
张六169165188211141194231235
a.loc[['张二','张四','张六'],['语文','物理','地理']]
语文物理地理
张二175226228
张四86225146
张六169211235
#  张二的语文,张四的物理,张六的地理未考,设置为NAN(注意:0和NAN不一样)
for row,col in [
    ('张二','语文'),
    ('张四','物理'),
    ('张六','地理')
]:
    a.loc[row,col] = np.nan
a
语文数学英语物理化学生物历史地理
张一213.0103148185.0140224170122.0
张二NaN81215226.0222210142228.0
张三111.080118195.0122130193139.0
张四86.0227166NaN204153114146.0
张五147.08912296.0127114124180.0
张六169.0165188211.0141194231NaN
a
语文数学英语物理化学生物历史地理
张一213.0103148185.0140224170122.0
张二NaN81215226.0222210142228.0
张三111.080118195.0122130193139.0
张四86.0227166NaN204153114146.0
张五147.08912296.0127114124180.0
张六169.0165188211.0141194231NaN
# 还原
a = DataFrame(np.random.randint(1,151,size=(6,8)),index,columns,dtype=int)
a
语文数学英语物理化学生物历史地理
张一138135384631170100
张二427656149171336898
张三10463166441732714
张四101363213284922459
张五2232621372713953121
张六209189971775526
# 把上面例子封装   张二的语文,张四的物理,张六的地理未考,设置为NAN
# copy=False  ——不创建副本
def nan(df,*data,copy=True):
    """
    @df 是DataFrame数据对象
    @data 是数据的元素类型是tuple (行标签,列标签)
    @copy 是bool值,False表示在原有的df中修改,True表示创建副本    
    """
    df_ = df.copy() if copy else df
    for row,col in data:
        df_.loc[row,col] = np.nan
        
    if copy:
        return df_
    else:
        return df
c =nan(a,('张二','语文'),('张四','物理'),('张六','地理'))  # 默认创建的副本
c
语文数学英语物理化学生物历史地理
张一138.0135384.0631170100.0
张二NaN7656149.0171336898.0
张三104.0631664.041732714.0
张四10.013632NaN84922459.0
张五22.03262137.02713953121.0
张六20.0918997.0177552NaN
# 原来的a没有改变
a
语文数学英语物理化学生物历史地理
张一138135384631170100
张二427656149171336898
张三10463166441732714
张四101363213284922459
张五2232621372713953121
张六209189971775526
# 例:张三的数学为NAN 
d = nan(a,('张三','数学'))
d
语文数学英语物理化学生物历史地理
张一138135.0384631170100
张二4276.056149171336898
张三104NaN166441732714
张四10136.03213284922459
张五2232.0621372713953121
张六2091.089971775526
a   # 因为创建副本,所有原有数据没有发生变化
语文数学英语物理化学生物历史地理
张一138135384631170100
张二427656149171336898
张三10463166441732714
张四101363213284922459
张五2232621372713953121
张六209189971775526
# 例:张三的数学为NAN  ,不创立副本,在原有数组上面做
w = nan(a,('张三','数学'),copy=False)
w
语文数学英语物理化学生物历史地理
张一138135.0384631170100
张二4276.056149171336898
张三104NaN166441732714
张四10136.03213284922459
张五2232.0621372713953121
张六2091.089971775526
a   # 原有数据也发生变化
语文数学英语物理化学生物历史地理
张一138135.0384631170100
张二4276.056149171336898
张三104NaN166441732714
张四10136.03213284922459
张五2232.0621372713953121
张六2091.089971775526
a
语文数学英语物理化学生物历史地理
张一138135.0384631170100
张二4276.056149171336898
张三104NaN166441732714
张四10136.03213284922459
张五2232.0621372713953121
张六2091.089971775526
# 把张一的地理设置为NAN
#  None在DataFrame中,也表示NAN
a.loc['张一','地理'] =None
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0

丢失数据的五种表示方法(关于NAN值的理解,可以理解为缺失的数据)

  • None 不常见
  • np.nan(NaN) 不常见
  • np.NaN 常见
  • np.nan 常见
  • np.NAN 常见
a.isna()
语文数学英语物理化学生物历史地理
张一FalseFalseFalseFalseFalseFalseFalseTrue
张二FalseFalseFalseFalseFalseFalseFalseFalse
张三FalseTrueFalseFalseFalseFalseFalseFalse
张四FalseFalseFalseFalseFalseFalseFalseFalse
张五FalseFalseFalseFalseFalseFalseFalseFalse
张六FalseFalseFalseFalseFalseFalseFalseFalse
a.isna().any()
语文    False
数学     True
英语    False
物理    False
化学    False
生物    False
历史    False
地理     True
dtype: bool
# 如果Series对象的数据是bool内容,标签是列标签是,使用.loc[:,series_bools]
# 如果标签是行标签时,使用[series_bools],或.loc[series_bool]
m = a.loc[:,a.isna().any()]
m
数学地理
张一135.0NaN
张二76.098.0
张三NaN14.0
张四136.059.0
张五32.0121.0
张六91.06.0
m.isna().any(axis=1)
张一     True
张二    False
张三     True
张四    False
张五    False
张六    False
dtype: bool
m[m.isna().any(axis=1)]
数学地理
张一135.0NaN
张三NaN14.0

异常值的处理

  • isnull()
  • notnull()
  • dropna():过滤丢失的数据
  • fillna():填充丢失数据
  • 前置填充 axis=0 行
  • 后置填充 axis=1 列 (速记:上下用0,左右用1)
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
a.dropna() # a.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
#  默认axis=0,把带NAN的所有行删除 
# axis值的含义
#   * 0, or 'index' : Drop rows which contain missing values.
#   * 1, or 'columns' : Drop columns which contain missing value.
语文数学英语物理化学生物历史地理
张二4276.056149171336898.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
# axis=1 时删除的是列
a.dropna(axis=1)
语文英语物理化学生物历史
张一138384631170
张二42561491713368
张三1041664417327
张四1032132849224
张五22621372713953
张六208997177552
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
"""
how : {'any', 'all'}, default 'any'
    Determine if row or column is removed from DataFrame, when we have
    at least one NA or all NA.

    * 'any' : If any NA values are present, drop that row or column.
    * 'all' : If all values are NA, drop that row or column.
"""
a.dropna(axis=1,how='any')  # axis=1,how='any' 这一列,只要有一个值是NAN,就删除这一列
语文英语物理化学生物历史
张一138384631170
张二42561491713368
张三1041664417327
张四1032132849224
张五22621372713953
张六208997177552
a.dropna(axis=1,how='all')  # axis=1,how='any' 这一列,所有的值是NAN,才删除这一列
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
"""
inplace : bool, default False
    If True, do operation inplace and return None.
"""
# inplace属性,false时,表示副本上操作,true时,表示原数据上操作

'\ninplace : bool, default False\n    If True, do operation inplace and return None.\n'
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
aa = a.copy()
aa.dropna(axis=1,how='any',inplace=True) #  axis=1 删列

aa
语文英语物理化学生物历史
张一138384631170
张二42561491713368
张三1041664417327
张四1032132849224
张五22621372713953
张六208997177552
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
aa
语文英语物理化学生物历史
张一138384631170
张二42561491713368
张三1041664417327
张四1032132849224
张五22621372713953
张六208997177552

异常值填充

fillna() 填充nan值数据
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
# 以固定值的方式填充
# 给所有nan填充0
a.fillna(0)
语文数学英语物理化学生物历史地理
张一138135.03846311700.0
张二4276.056149171336898.0
张三1040.0166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
# 现有值填充
# 可以用nan上下左右旁边值填充  列前,列后,行前,行后
# method的方法  {'backfill', 'bfill', 'pad', 'ffill', None}
# backfill——后填充,简写bfill
# ffill——前填充,pad
# 列前填充
#  axis {0 or 'index', 1 or 'columns'}
a.fillna(method="ffill",axis=1)    # 上下用0,左右用1
语文数学英语物理化学生物历史地理
张一138.0135.03.084.063.011.070.070.0
张二42.076.056.0149.017.0133.068.098.0
张三104.0104.016.064.041.073.027.014.0
张四10.0136.032.0132.084.092.024.059.0
张五22.032.062.0137.027.0139.053.0121.0
张六20.091.089.097.017.075.052.06.0
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
# 行前填充
a.fillna(method="ffill",axis=0)   # 在一个列上,上面值填充下面值,因为张一的地理上面没值,所以没有填充
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三10476.0166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
a
语文数学英语物理化学生物历史地理
张一138135.0384631170NaN
张二4276.056149171336898.0
张三104NaN166441732714.0
张四10136.03213284922459.0
张五2232.0621372713953121.0
张六2091.089971775526.0
# 列后填充
a.fillna(method="bfill",axis=1)  # 在一个行上,后面值填充前面值,因为张一的地理后面没值,所以没有填充
语文数学英语物理化学生物历史地理
张一138.0135.03.084.063.011.070.0NaN
张二42.076.056.0149.017.0133.068.098.0
张三104.016.016.064.041.073.027.014.0
张四10.0136.032.0132.084.092.024.059.0
张五22.032.062.0137.027.0139.053.0121.0
张六20.091.089.097.017.075.052.06.0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今晚务必早点睡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值