Python 数据分析之 Numpy (二)

    技术2024-12-20  3

    作者:小蜗牛爱学习 来源:https://blog.csdn.net/qq_42755939/article/details/107032142

    一、Numpy读取文件

    loadtxt()方法

    numpy.loadtxt(fname, dtype=, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0)

    参数作用fname被读取的文件名(文件的相对地址或者绝对地址)dtype指定读取后数据的数据类型comments跳过文件中指定开头的行(即不读取),比如comments=’#'表示不读取以#开头的数据delimiter指定读取文件中数据的分割符converters对读取的数据进行预处理skiprows选择跳过的行数usecols指定需要读取的列unpack选择是否将数据进行向量输出,相当于将源数据转置输出encoding对读取的文件进行预编码 import numpy as np #读取文件loadtxt()方法 GB_vido_path = "GB_video_data_numbers.csv" US_vido_path = "US_video_data_numbers.csv" t1 = np.loadtxt(GB_vido_path,dtype = "i8", delimiter=",") t2 = np.loadtxt(US_vido_path,dtype="i8", delimiter=",") print(t1) print("*"*100) print(t2)

    二、数组转置的三种方法

    方法一:使用属性T

    方法二:使用方法transpose()

    方法三:使用方法swapaxes()

    arr01 = np.arange(2,8).reshape(2,3) print("arr01:",arr01) #arr01: [[2 3 4] [5 6 7]] #方法一:使用属性T arr02 = arr01.T print("arr02:",arr02) #arr02: [[2 5] [3 6] [4 7]] #方法二:使用方法transpose() arr03 = arr01.transpose() #arr03: [[2 5] [3 6] [4 7]] print("arr03:",arr03) #方法三:使用方法 arr04 = arr01.swapaxes(1,0) print("arr04:",arr04) #arr03: [[2 5] [3 6] [4 7]]

    三、Numpy的索引与切片

    #取数组中的行 t = np.arange(1,73).reshape(8,9) print(t) print("*"*100) #取单值 t0 = t[2,3] print("t0",t0) #取多个值 print(t[[1,3],[5,6]]) #取一行 t1 = t[2] #取第三行 print("t1:",t1) #取连续的多行 t2 = t[2:5] print("t2",t2) #取第三行到第五行 #取不连续的多行 t3 = t[[2,4,5]] print("t3:",t3) #取数组中的列 #取某一列 t4 = t[:,2] #取第三列 print("t4:",t4) #取连续的多列 t5 = t[:,2:5] #取第三到第五列 print("t5:",t5) t6 = t[:,[1,3,7]] #取不连续的多列 print("t6:",t6) #取连续的多行和多列 t7 = t[2:4,4:6] print("t7:",t7)

    四、修改numpy的值与bool索引

    1、修改值

    n1 = np.arange(1,64).reshape(7,9) n1[:,2:5] = 0 print("n1:",n1)#将第三列到第五列的值改为0 n2 = np.arange(1,64).reshape(7,9) n2[n2>40] =40 print("n2:",n2) #将大于40的修改为40 n3 = np.arange(1,64).reshape(7,9) print(n3>40) #numpy的bool索引

    2、Numpy中的三元运算

    where()方法

    r = np.arange(54).reshape(6,9) print(np.where(r>30,30,0))#将r中大于30的修改30,小于30的修改为0

    3、numpy的clip()方法

    arr = np.arange(1,29).reshape(4,7) arr = arr.astype("float64") arr[3:6,3:] = np.nan print("arr:",arr) #arr: [[ 1. 2. 3. 4. 5. 6. 7.] [ 8. 9. 10. 11. 12. 13. 14.] [15. 16. 17. 18. 19. 20. 21.] [22. 23. 24. nan nan nan nan]] arr1 = arr.clip(5,15) #将arr1中小于5的修改为5,大于15的修改为15,但是不会修改nan值 print("arr1:",arr1) #arr1: [[ 5. 5. 5. 5. 5. 6. 7.] [ 8. 9. 10. 11. 12. 13. 14.] [15. 15. 15. 15. 15. 15. 15.] [15. 15. 15. nan nan nan nan]]

    五、Numpy中的nan和inf

    1、什么是nan?

    nan(NAN,Nan):not a number 表示不是一个数字

    2、numpy中会nan是如何产生的?

    当我们读取本地的文件为float的时候,如果有缺失,就会出现nan,当做了一个不合适的计算的时候(比如无穷大减去无穷大)

    3、inf

    inf(-inf,inf) : infinity, +inf表示正无穷,-inf表示负无穷

    注意1:什么时候会出现inf包括(-inf,+inf)?

    ​ 如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)

    注意2:那么如何指定一个nan或者inf呢?

    注意3:他们的type类型

    a = np.nan b = np.inf print(type(a),type(b)) #<class 'float'> <class 'float'>

    4、numpy中的nan的注意点

    1、两个nan不相等
    print("两个nan是否相等:",np.nan == np.nan) #两个nan是否相等: False print(np.nan != np.nan) #True
    2、判断一个数组里面有几个nan值
    count_nonzero():判断数组里面0或者True的个数
    arr1 = np.array([1., 2., 3., 4., np.nan, 5., np.nan]) print(arr1) print(arr1 != arr1) #[False False False False True False True] print(np.count_nonzero(arr1 != arr1)) #2
    3、将nan值转化为0
    np.isnan(arr)判断数组中nan值
    arr2 = arr1 print(np.isnan(arr2)) #[False False False False True False True] arr1[np.isnan(arr2)] = 0 print(arr2) #[1. 2. 3. 4. 0. 5. 0.]
    4、nan与任何值计算都为nan

    数据分析中nan值的处理

    那么问题来了,在一组数据中单纯的把nan替换为0,合适么?会带来什么样的影响?

    比如,全部替换为0后,替换之前的平均值如果大于0,替换之后的均值肯定会变小,所以更一般的方式是把缺失的数值替换为均值(中值)或者是直接删除有缺失值的一行

    那如何计算一组数据的中值或者是均值?

    六、Numpy中常用统计函数

    1、求和:t.sum(axis=None) 2、均值:t.mean(a,axis=None) 受离群点的影响较大 3、中值:np.median(t,axis=None) 4、最大值:t.max(axis=None) 5、最小值:t.min(axis=None) 6、极值:np.ptp(t,axis=None) 即最大值和最小值只差 7、标准差:t.std(axis=None)

    注意:默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

    七、数据清洗–Numpy如何处理缺失值填充均值

    nan = np.nan t = np.array([ [ nan, 1., nan, 7., 4., 18.], [ 9., 2., nan, 9., 10., 11.], [ nan, 13., 14., nan, 16., 88.], [ 18., nan, 51., 20., nan, 63.] ]) def fill_nan_by_column_mean(t): """将列的平均值替换nan""" for i in range(t.shape[1]): #获取当列的nan值的个数 nan_num = np.count_nonzero(t[:,1][t[:,i] != t[:,i]]) if nan_num > 0: now_col = t[:,i] #求当前列非nan值的和 now_col_num = now_col[t[:,i] == t[:,i]].sum() #求平均值 avg = round((now_col_num / (now_col.shape[0] - nan_num)), 2) #将平均值替代nan now_col[np.isnan(now_col)] = avg t[:,i] = now_col return t t = fill_nan_by_column_mean(t) print(t) #结果如下: [ [13.5 1. 32.5 7. 4. 18. ] [ 9. 2. 32.5 9. 10. 11. ] [13.5 13. 14. 12. 16. 88. ] [18. 5.33 51. 20. 10. 63. ] ]

    推荐阅读:

    我精心整理的 136 页 Excel 数据透视表 PDF 文件!【附获取方式】100天从 Python 小白到大神的学习资源,都在这了。不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏…我花了五个小时的时间,将全部文章详细整理出来了,千万不要错过!

    关注微信公众号『杰哥的IT之旅』,后台回复“1024”查看更多内容,回复“微信”添加我微信。

    Jack Tian 认证博客专家 Linux 运维 GitHub 杰哥,博客专家、首页内容推荐官、互联网IT领域个人公众号、分享Linux运维、Python、开源项目、开发工具、编程技术、行业前沿资讯等相关内容干货!(关注后回复“1024”查看更多精选优质内容)
    Processed: 0.309, SQL: 9