python数据分析——数据的选择和运算

数据的选择和运算

  • 前言
  • 一、数据选择
    • NumPy的数据选择
      • 一维数组元素提取
        • 示例
      • 多维数组行列选择、区域选择
        • 示例
      • 花式索引与布尔值索引
        • 布尔索引
          • 示例一
          • 示例二
        • 花式索引
          • 示例一
          • 示例二
    • Pandas数据选择
      • Series数据获取
      • DataFrame数据获取
        • 列索引取值
          • 示例一
          • 示例二
        • 取行方式
          • 示例
          • loc() 方法
            • 示例
          • iloc()方法
            • 示例
  • 二、多表合并
    • 使用merge()方法合并数据集
      • 示例
      • 使用一个键合并两个数据帧
      • 使用多个键合并两个数据帧:
      • 使用“how”参数合并
        • 示例一
        • 示例二
        • 示例三
        • 示例四
    • 使用join()方法合并数据集
      • 示例
    • 使用concat()方法合并数据集
      • 示例
  • 三、算术运算与比较运算
    • sum()
      • 示例
    • prod()
      • 示例
    • 四则运算和数学运算
    • 比较运算符
  • 四、数据运算
    • 非空值计数
      • count()
      • 示例
    • 均值运算
      • mean()
      • 示例
    • 中位数运算
      • median
      • 示例
    • 众数运算
      • mode()
      • 示例
    • 分位数运算
      • quantile()
      • 示例
  • 五、数值排序与排名
    • sort_values()
    • 示例


前言

在数据分析中,数据的选择和运算是非常重要的步骤。数据选择和运算是数据分析中的基础工作,正确和高效的选择和运算方法对于数据分析结果的准确性和速度至关重要。
在这里插入图片描述


一、数据选择

NumPy的数据选择

NumPy数组索引所包含的内容非常丰富,有很多种方式选中数据中的子集或者某个元素。主要有以下四种方式:

索引方式使用场景
基础索引获取单个元素
切片获取子数组
布尔索引根据比较操作,获取数组元素
数组索引传递索引数组,更加快速,灵活的获取子数据集

数组的索引主要用来获得数组中的数据。在NumPy中数组的索引可以分为两大类:

  1. 一维数组的索引;
  2. 二维数组的索引。

一维数组的索引和列表的索引几乎是相同的,二维数组的索引则有很大不同。

一维数组元素提取

沿着单个轴,整数做下标用于选择单个元素,切片做下标用于选择元素的范围和序列。

正整数用于从数组的开头开始索引元素(索引从0开始),而负整数用于从数组的结尾开始索引元素,其中最后一个元素的索引是-1,第二个到最后一个元素的索引是-2,以此类推。在这里插入图片描述
关于NumPy数组的索引和切片操作的总结,如下表:在这里插入图片描述

示例

【例】利用Python的Numpy创建一维数组,并通过索引提取单个或多个元素。

关键技术: NumPy数组的索引和切片,一维数组切片的语法为: [start:stop:step]

程序代码如下所示:

import numpy as np
a = np.arange(1,10)
a
a[-1]
a[1:3]
a[2:]
a[1:5:2] #从1 到5 增量为2 

在这里插入图片描述

多维数组行列选择、区域选择

二维数组的索引格式是[a:b,m:n],逗号前选择行,逗号后选择列。而在选择行和列的时候可以传入列表,或者使用冒号来进行切片索引。

二维数组索引语法总结如下:

[对行进行切片,对列的切片]
  • 对行的切片:可以有start:stop:step
  • 对列的切片:可以有start:stop:step

在这里插入图片描述

import pandas as pd
data = np.random.randint(1,100,(5,5))
df = pd.DataFrame(data = data)
df
df.loc[1:5:2,1:5:2]
print(data)
data[1:5:2,1:5:2]

在这里插入图片描述
在这里插入图片描述

示例

【例】请使用Python对如下的二维数组进行提取,选择第一行第二列的数据元素并输出。

关键技术:多维数组的索引与一维数组的索引相似,但索引语言更为自然,只需要使用[ ]运算符和逗号分隔符即可,具体程序代码如下所示:

arr = np.array([[1,2,3],[4,5,6]])
arr[0,1]

在这里插入图片描述

花式索引与布尔值索引

布尔索引

我们可以通过一个布尔数组来索引目标数组,以此找出与布尔数组中值为True的对应的目标数组中的数据。

需要注意的是,布尔数组的长度必须与目标数组对应白轴的长度一致。

示例一

【例】一维数组的布尔索引。

关键技术:假设我们有一个长度为7的字符串数组,然后对这个字符串数组进行逻辑运算,进而把元素的结果(布尔数组)作为索引的条件传递给目标数组。

具体程序代码如下所示:在这里插入图片描述

示例二

【例】二维数组的布尔索引。

关键技术:布尔数组中,下标为0,3,4的位置是True,因此将会取出目标数组中第0,3,4行。

具体程序代码如下所示:

在这里插入图片描述

花式索引
示例一

【例】找出数组arr中大于15的元素。

关键技术:与上面的例子不一样,这个例子返回的结果是一个一维数组。

具体程序代码如下所示:在这里插入图片描述

示例二

【例10】根据上面的例子引申,把上述数组中,小于或等于15的数归零。

关键技术:该例类似于数据清洗,那么可以通过下面的方式。可以采用arr<=15得到的布尔值作为索引,将小于或者等于15的数归零。

具体程序代码如下所示:在这里插入图片描述

Pandas数据选择

Series数据获取

在这里插入图片描述

s = pd.Series(data = [1,2,3,4,5,6],index = ['a','c','b','a','b','b'])
s['a']

在这里插入图片描述

DataFrame数据获取

列索引取值

使用单个值或序列,可以从DataFrame中索引出一个或多个列。

这里用df代表pd.DataFrame(数据),如下表:在这里插入图片描述

示例一

【例】从DataFrame中抽取age

关键技术:列索引取值

df = pd.DataFrame(data = [[22,'北京','律师'],[26,'四川成都','工程师'],[24,'江苏南京','研究员'],[11,'山东青岛','医生']],index = pd.Index(['张某','李某','赵某','段某'],name = 'Name'),columns = ['age','籍贯','职业'])
df

在这里插入图片描述

示例二

【例】当我们转换成Series结构后,通过下标和值均可以相互获取。

关键技术:可以通过对应的下标或行索引来获取值,也可以通过值获取对应的索引对象以及索引值。

具体程序代码如下所示:
在这里插入图片描述

取行方式
示例

【例】通过切片方式选取多行。

关键技术:注意这里使用的是一个中括号,这里的2代表步长: ["张某" : "段某" :2] =[下界:上界:步长]

具体程序代码如下所示:在这里插入图片描述

loc() 方法

直接使用法
在这里插入图片描述

横向(行索引index)是必备的。

示例

【例17】使用loc()方法选取行。

df = pd.DataFrame(data = [[22,'北京','律师'],[26,'四川成都','工程师'],[24,'江苏南京','研究员'],[11,'山东青岛','医生']],index = pd.Index(['张某','李某','赵某','段某'],name = 'Name'),columns = ['age','籍贯','职业'])
df

在这里插入图片描述
下面代码执行的结果都是相同的,方法可以通用

在这里插入图片描述
选取多行的语法为:变量名.loc[[行index1 行index2,……]]

在这里插入图片描述

iloc()方法

iloc的使用与loc完全类似,只不过是针对“位置(=第几个)"进行筛选。

函数语法为: .iloc[整数、整数列表、整数切片、布尔列表以及函数]

[ ]里面的使用方法同.loc[ ]方法。

示例

【例】采用上面例题的DataFrame,用iloc()函数结合lambda函数获取行数据。

关键技术:这里介绍一下.iloc[函数]中的函数使用方法

  • 函数 =自定义函数(函数的返回值需要是合法对象(= 整数、整数列表、整数切片、布列表))
  • 匿名函数lambda :使用方法
    语法: lambda自变量: slice(start =下界, stop =上界, step =步长)
    具体程序代码如下所示:
    在这里插入图片描述

二、多表合并

有的时候,我们需要将一些数据片段进行组合拼接,形成更加丰富的数据集。Python的Pandas库为数据合并操作提供了多种合并方法,如merge()join()concat()等方法。

使用merge()方法合并数据集

Pandas提供了一个函数merge,作为DataFrame对象之间所有标准数据库连接操作的入口点。

Pandas是Python中用于数据处理和分析的强大库之一。merge()函数是Pandas库中用于合并两个或多个DataFrame对象的函数。它类似于SQL中的JOIN操作,可以根据指定的列将两个DataFrame中的数据合并起来。

merge()函数的语法如下:

pandas.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)

参数说明:

  • left, right: 要合并的两个DataFrame对象。
  • how: 指定合并方式,可选值为 ‘inner’, ‘outer’, ‘left’, ‘right’,默认为 ‘inner’。
  • on: 指定合并操作的列名(leftright都必须存在此列),默认值为 None。如果指定了on参数,则left_onright_on参数会被忽略。
  • left_on, right_on: 分别指定leftright中用于合并的列的列名,默认为 Noneleft_onright_on参数可以用于指定不同名称的列来进行合并操作。
  • left_index, right_index: 分别指示是否使用leftright的索引作为合并键,默认为 False
  • sort: 指示是否按照合并键进行排序,默认为 False
  • suffixes: 指定合并后重复列的后缀,默认为 (‘_x’, ‘_y’)。
  • copy: 指示是否创建合并结果的副本,默认为 True
  • indicator: 指示是否在结果中添加一个名为 ‘_merge’ 的列来表示每行的合并方式,默认为 False
  • validate: 指定合并操作是否被验证为 {‘one_to_one’, ‘one_to_many’, ‘many_to_one’, ‘many_to_many’} 中的一种,默认为 None,不进行验证。

下面是一些例子来说明merge()函数的用法:

  1. 根据共同的列进行合并:
import pandas as pddf1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})
df2 = pd.DataFrame({'A': [1, 2, 3], 'C': [4, 5, 6]})result = pd.merge(df1, df2, on='A')
print(result)

输出:

   A  B  C
0  1  a  4
1  2  b  5
2  3  c  6
  1. 指定不同的列进行合并:
import pandas as pddf1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})
df2 = pd.DataFrame({'D': [1, 2, 3], 'C': [4, 5, 6]})result = pd.merge(df1, df2, left_on='A', right_on='D')
print(result)

输出:

   A  B  D  C
0  1  a  1  4
1  2  b  2  5
2  3  c  3  6
  1. 指定合并方式为外连接:
import pandas as pddf1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})
df2 = pd.DataFrame({'A': [3, 4, 5], 'C': [4, 5, 6]})result = pd.merge(df1, df2, on='A', how='outer')
print(result)

输出:

   A    B    C
0  1    a  NaN
1  2    b  NaN
2  3    c  4.0
3  4  NaN  5.0
4  5  NaN  6.0

注意:merge()函数还有很多其他参数和用法,可以根据需要查阅Pandas的文档来进一步了解。

示例

【例】创建两个不同的数据帧,并使用merge()对其执行合并操作。

关键技术:merge()函数

首先创建两个DataFrame对象。

left = pd.DataFrame(data = {'id':[1,2,3,4,5],'name':['alex','amy','allen','alice','ayoung'],'subject_id':['sub1','sub2','sub4','sub6','sub5']})
right = pd.DataFrame(
data = {'id':[1,2,3,4,5],'name':['billy','brian','bran','bryce','betty'],
'subject_id':['sub2','sub4','sub3','sub6','sub5']})
left

在这里插入图片描述

在这里插入图片描述

使用一个键合并两个数据帧

关键技术:使用’ id’键合并两个数据帧,并使用merge()对其执行合并操作。

代码和输出结果如下所示:
在这里插入图片描述

使用多个键合并两个数据帧:

关键技术:使用’ id’键及’subject_id’键合并两个数据帧,并使用merge()对其执行合并操作。

代码和输出结果如下所示:
在这里插入图片描述

使用“how”参数合并

关键技术:how参数指定如何确定结果表中包含哪些键。如果左表或右表中都没有出现组合键,则联接表中的值将为NA
在这里插入图片描述

示例一

【例21】采用上面例题的dataframe,使用Left Join左连接方式合并数据帧。

关键技术:请注意on='subject id', how='left'。代码如下:
在这里插入图片描述

示例二

【例22】使用Right Join右连接方式合并数据帧。

关键技术:请注意on='subject_id', how='right'。代码如下:
在这里插入图片描述

示例三

【例23】使用outer Join外连接方式合并数据帧。

关键技术:请注意on='subject_id', how=' outer'。代码如下:
在这里插入图片描述

示例四

【例24】使用inner Join合并数据帧。

关键技术:请注意on='subject_id', how=' inner' 。代码如下:
在这里插入图片描述

使用join()方法合并数据集

join()是最常用的函数之一, join()方法用于将序列中的元素以指定的字符连接生成一个新的字符串。

join函数的语法如下:

DataFrame.join(other, on=None, how='left', lsuffix='', rsuffix='')

参数说明:

  • other:要合并的另一个数据框(DataFrame)。
  • on:指定用于合并的列名或索引级别的名称。如果没有指定,则使用两个数据框中的共同列名进行合并。
  • how:指定合并方式,有"left"、“right”、“inner"和"outer"四种选项。默认为"left”,表示按照左侧数据框的索引进行合并。
  • lsuffixrsuffix:如果两个数据框存在相同的列名,可以通过这两个参数来指定在合并后的结果中如何区分这些列。默认为空字符串。

示例代码:

import pandas as pd# 创建两个数据框
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})
df2 = pd.DataFrame({'A': [4, 5, 6], 'B': ['d', 'e', 'f']})# 使用join函数合并两个数据框
result = df1.join(df2, lsuffix='_left', rsuffix='_right')print(result)

输出结果:

   A_left B_left  A_right B_right
0       1      a        4       d
1       2      b        5       e
2       3      c        6       f

在这个示例中,我们创建了两个数据框df1df2,并使用join函数将它们合并成一个新的数据框result。合并后的数据框包含了两个数据框的所有列,并根据列名进行区分。在这里,我们使用了lsuffix参数来标识df1中的列,使用rsuffix参数来标识df2中的列。

除了默认的"left"合并方式,join函数还支持其他合并方式:

  • right”:按照右侧数据框的索引进行合并。
  • inner”:按照两个数据框的共同索引进行合并,只保留交集部分。
  • outer”:按照两个数据框的索引进行合并,保留并集部分。

示例

【例】对于存储在本地的销售数据集"sales.csv" ,使用Python的join()方法,将两个数据表切片数据进行合并。

关键技术: join()函数。

具体程序代码如下所示:

在这里插入图片描述

使用concat()方法合并数据集

pandasconcat函数用于沿指定轴将多个对象进行连接。它可以实现不同数据源的合并,类似于SQL中的join操作。

concat函数的基本语法如下:

pd.concat(objs, axis=0, join='outer', ignore_index=False)

参数说明:

  • objs:要连接的对象,可以是SeriesDataFrame或者Panel对象的序列或字典。
  • axis:指定连接的轴向,默认为0,表示沿着行方向进行连接,如果为1,则沿着列方向进行连接。
  • join:指定连接的方式,默认为’outer’,表示取并集。可以选择’inner’,表示取交集。
  • ignore_index:当连接的对象具有不同的索引时,是否忽略原来的索引,默认为False,表示保留原来的索引。

下面是一些常用的示例:

  1. 连接两个DataFrame对象,沿行方向进行连接:
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
result = pd.concat([df1, df2])

结果为:

   A  B
0  1  3
1  2  4
0  5  7
1  6  8
  1. 连接两个DataFrame对象,沿列方向进行连接:
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'C': [5, 6], 'D': [7, 8]})
result = pd.concat([df1, df2], axis=1)

结果为:

   A  B  C  D
0  1  3  5  7
1  2  4  6  8
  1. 连接两个Series对象,沿行方向进行连接:
s1 = pd.Series([1, 2])
s2 = pd.Series([3, 4])
result = pd.concat([s1, s2])

结果为:

0    1
1    2
0    3
1    4
dtype: int64
  1. 忽略原来的索引,重新生成新的索引:
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}, index=['a', 'b'])
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]}, index=['c', 'd'])
result = pd.concat([df1, df2], ignore_index=True)

结果为:

   A  B
0  1  3
1  2  4
2  5  7
3  6  8

这些只是一些基本的示例,concat函数还支持更多的参数配置,比如连接对象的顺序、连接对象的索引等。详细的用法可以参考pandas官方文档。

示例

【例】使用Concat连接对象。

关键技术: concat函数执行沿轴执行连接操作的所有工作,可以让我们创建不同的对象并进行连接。axis表示选择哪一个方向的堆叠,0为纵向(默认),1为横向
在这里插入图片描述
【例】实现将特定的键与被切碎的数据帧的每一部分相关联。

关键技术:假设你想在连接轴上创建一个层次化索引来区分片段,使用keys参数可达到这个目的。

代码如下:
在这里插入图片描述
【例】输出结果不展示行索引。

关键技术:如果DataFrame行索引和当前分析工作无关且不需要展示,需要将ignore_index设置为True。请注意,索引会完全更改,键也会被覆盖。

在这里插入图片描述

【例】按列合并对象。

关键技术:如果需要沿axis=1合并两个对象,则会追加新列到原对象右侧。

在这里插入图片描述

【例】对于存储在本地的销售数据集"sales.csv" ,使用Python将两个数据表切片数据进行合并

关键技术:注意未选择数据的属性用NaN填充。程序代码如下所示:
在这里插入图片描述

三、算术运算与比较运算

通过一些实例操作来介绍常用的运算函数,包括一个数组内的求和运算、求积运算,以及多个数组间的四则运算。

sum()

numpysum函数用于计算数组元素的和。

语法:

numpy.sum(a, axis=None, dtype=None, out=None, keepdims=False)

参数:

  • a:数组或数组类似的对象。
  • axis:沿着某个轴计算和,默认为None,表示计算所有元素的和。
  • dtype:指定返回的结果的数据类型,默认为None,表示保持输入数组的数据类型。
  • out:指定返回结果的输出数组。
  • keepdims:若为True,则维度保持不变,默认为False

返回值:数组元素的和。

示例:

import numpy as nparr = np.array([1, 2, 3, 4, 5])
sum_result = np.sum(arr)
print(sum_result)  # 输出:15arr2 = np.array([[1, 2], [3, 4], [5, 6]])
sum_result2 = np.sum(arr2, axis=0)
print(sum_result2)  # 输出:[9 12]sum_result3 = np.sum(arr2, axis=1)
print(sum_result3)  # 输出:[3 7 11]

在上面的示例中,首先创建了一个一维数组arr和一个二维数组arr2。然后使用np.sum函数分别计算了arrarr2的和。在计算arr的和时,没有指定axis参数,因此计算的是数组所有元素的和。在计算arr2的和时,指定了axis参数为0,表示沿着第一个轴(行)计算和,返回的结果是每列的和。又指定了axis参数为1,表示沿着第二个轴(列)计算和,返回的结果是每行的和。

示例

【例】使用Python对给定的数组元素进行求和运算。

关键技术:可以使用Python的sum()函数,程序代码如下所示:在这里插入图片描述

prod()

numpyprod函数是用来计算数组元素的乘积的。它可以接受一个数组作为输入,并返回所有元素的乘积。语法如下:

numpy.prod(a, axis=None, dtype=None, keepdims=<no value>)

参数说明:

  • a:要计算乘积的数组。
  • axis:指定沿着哪个轴计算乘积。默认为None,表示计算整个数组的乘积。
  • dtype:指定返回的结果的数据类型。默认为None,表示保持输入数组的数据类型。
  • keepdims:指定是否保留结果的维度。默认为False,表示不保留。

使用例子:

import numpy as nparr = np.array([1, 2, 3, 4])
result = np.prod(arr)
print(result)  # 输出24arr2 = np.array([[1, 2], [3, 4]])
result2 = np.prod(arr2, axis=0)
print(result2)  # 输出[3 8]

在第一个例子中,我们计算了数组[1, 2, 3, 4]的乘积,得到24。在第二个例子中,我们计算了二维数组[[1, 2], [3, 4]]在轴0上的乘积,即对每一列进行乘积运算,得到[3, 8]

需要注意的是,numpyprod函数对于空数组的返回值是1,而对于包含0的数组,返回值为0。

示例

【例】使用Python对给定的数组元素的求乘积运算。

关键技术:可以使用Python的prod()函数

返回给定轴上的数组元素的乘积。程序代码如下所示:

在这里插入图片描述

四则运算和数学运算

【例】请使用Python对多个数组进行求和运算操作。

关键技术:采用运算符号’+'可以对数组进行求和运算操作,但需要各个数组的维度相同,

程序如下所示在这里插入图片描述
【例】请使用Python对数值和数组进行求积运算操作。

关键技术:可以使用乘法运算符*,程序如下所示在这里插入图片描述
【例】请使用Python对多个数组间进行求积运算操作。

关键技术:可以使用乘法运算符*,程序如下所示在这里插入图片描述
【例】请使用Python对给定数组的元素进行以e为底的对数函数(log)的操作。

关键技术: np.log()函数实现的是In运算,程序代码如下所示
在这里插入图片描述
【例】请使用Python对给定数组的元素进行以10为底的对数函数(log10)的操作。

关键技术:np.log100函数是实现以10为底的对数运算

程序代码如下所示在这里插入图片描述
【例】请使用Python对给定数组的元素进行指数函数(exp)的操作。

关键技术: np.e表示以e为底,1为指数的数, np.e**2表示e为底数, 2为指数的数。

程序代码如下所示
在这里插入图片描述
其中np.pi代表圆周率π,输出结果如下
在这里插入图片描述
【例】请使用Python对给定数组的元素进行正弦函数的操作。

关键技术:可以使用sin()函数,程序代码如下所示在这里插入图片描述
【例】请使用Python对给定数组的元素进行正切函数的操作。

关键技术:可以利用Python的正切函数tan()进行计算,

程序代码如下所示:在这里插入图片描述

比较运算符

【例43】利用Python的比较运算符判断如下输出结果。

  • 98是否大于100
  • 25*4是否于等于76
  • 56.8是否等于56.8
  • 35是否等于35.0
  • False是否小于True

关键技术:可以利用Python的比较运算符<>==进行判断,

程序代码如下所示
在这里插入图片描述

四、数据运算

pandas中具有大量的数据计算函数,比如求计数、求和、求平均值、求最大值、最小值、中位数、众数、方差、标准差等。

非空值计数

count()

pandascount()函数用于计算数据框中非缺失值的数量。它返回每列中非缺失值的数量,可以应用于数据框和系列对象。

语法:

DataFrame.count(axis=0, level=None, numeric_only=False)

参数说明:

  • axis:表示计算的轴向,取值可以是0或1,默认为0。如果axis=0,表示按列计算非缺失值的数量;如果axis=1,表示按行计算非缺失值的数量。
  • level:仅在DataFrame具有多层索引时使用,表示计算的层级,默认为None。如果指定了level,则count()函数将在指定的层级上计算非缺失值的数量。
  • numeric_only:表示是否只计算数值类型的非缺失值数量,默认为False。如果numeric_only=True,表示只计算数值类型的非缺失值数量;如果numeric_only=False,表示计算所有数据类型的非缺失值数量。

返回值:

  • 如果axis=0,count()函数将返回每列中非缺失值的数量,并以DataFrame的形式展示。
  • 如果axis=1,count()函数将返回每行中非缺失值的数量,并以Series的形式展示。

示例:

import pandas as pd# 创建数据框
data = {'A': [1, 2, None, 4],'B': [None, 6, 7, 8],'C': ['a', 'b', 'c', 'd']}
df = pd.DataFrame(data)# 计算每列的非缺失值数量
print(df.count())# 计算每行的非缺失值数量
print(df.count(axis=1))

输出结果:

A    3
B    3
C    4
dtype: int64
0    2
1    3
2    2
3    3
dtype: int64

示例

【例】对于存储在该Python文件同目录下的某电商平台销售数据product_sales.csv,形式如下所示,请利用Python对数据读取,并计算数据集每列非空值个数情况。

在这里插入图片描述
关键技术:可以使用count()方法进行计算非空个数。程序代码如下所示:
在这里插入图片描述

【例】同样对于存储在该Python文件同目录下的某电商平台销售数据product_sales.csv,请利用Python对数据读取,并计算数据集每行非空值个数情况。

关键技术:可以利用count()方法进行计算非空个数,并利用参数axis来控制行列的计算,程序代码如下所示:
在这里插入图片描述
【例】对于上述数据集product_sales.csv,若需要特定的列“线上销售量"进行非空值计数,此时应该如何处理?

关键技术:可以利用标签索引和count()方法来进行计数,程序代码如下所示:
在这里插入图片描述
【例】对于上述数据集product_sales.csv,若需要特定的行进行非空值计数,应该如何处理?

关键技术:可以利用行号索引和count()方法来进行计数,程序代码如下所示:在这里插入图片描述
【例】对于给定的DataFrame数据,按索引值进行求和并输出结果。

关键技术:对于例子给定的DataFrame数据,按行进行求和并输出结果。

可以采用求和函数sum(),设置参数axis为0,则表示按纵轴元素求和,设置参数axis为1,则表示按横轴元素求和,程序代码如下所示:

在这里插入图片描述

在这里插入图片描述

均值运算

在Python中通过调用DataFrame对象的mean()函数实现行/列数据均值计算

mean()

pandas库中的mean()函数是用来计算SeriesDataFrame对象中数值的平均值的方法。

对于Series对象来说,mean()函数会忽略NaN值,计算非NaN值的平均值。

对于DataFrame对象来说,mean()函数会计算每列或每行的平均值,其中axis参数用于指定计算的方向。axis=0表示计算每列的平均值,axis=1表示计算每行的平均值。同样地,mean()函数会忽略NaN值,计算非NaN值的平均值。

下面是一些使用mean()函数的示例:

import pandas as pd# 创建一个Series对象
s = pd.Series([1, 2, 3, 4, 5, np.nan])# 计算s的平均值
mean_s = s.mean()
print(mean_s)
# 输出:3.0# 创建一个DataFrame对象
df = pd.DataFrame({'A': [1, 2, 3],'B': [4, 5, np.nan],'C': [6, 7, 8]})# 计算每列的平均值
mean_df_col = df.mean(axis=0)
print(mean_df_col)
# 输出:
# A    2.000000
# B    4.500000
# C    7.000000
# dtype: float64# 计算每行的平均值
mean_df_row = df.mean(axis=1)
print(mean_df_row)
# 输出:
# 0    3.666667
# 1    3.500000
# 2    6.000000
# dtype: float64

需要注意的是,mean()函数返回的结果为一个Series对象,其中索引是原始SeriesDataFrame对象的列名或行号,值为对应位置的平均值。

示例

【例】对于例48给定的DataFrame数据,统计数据的算数平均值并输出结果。

关键技术: mean()函数能够对对数据的元素求算术平均值并返回,程序代码如下所示:

在这里插入图片描述

中位数运算

median

pandasmedian()函数用于计算数据序列的中位数。中位数是将数据序列按升序排列后,中间位置的值。如果数据序列有奇数个元素,则中位数是中间位置的值;如果有偶数个元素,则中位数是中间两个位置的值的平均值。

median()函数的语法如下:

DataFrame.median(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)

参数说明:

  • axis:指定计算中位数的轴,默认为0,表示沿着行的方向计算中位数。可以设置为1表示沿着列的方向计算中位数。
  • skipna:是否忽略缺失值,默认为True
  • level:在多级索引的情况下,指定计算中位数的级别。
  • numeric_only:是否只计算数值型数据的中位数,默认为True

下面是一个例子,展示如何使用median()函数计算数据序列的中位数:

import pandas as pddata = {'A': [1, 2, 3, 4, 5],'B': [6, 7, 8, 9, 10],'C': [11, 12, 13, 14, 15]}
df = pd.DataFrame(data)# 沿着行的方向计算中位数
row_median = df.median(axis=1)
print(row_median)# 沿着列的方向计算中位数
column_median = df.median(axis=0)
print(column_median)

输出结果为:

0     6.0
1     7.0
2     8.0
3     9.0
4    10.0
dtype: float64
A     3.0
B     8.0
C    13.0
dtype: float64

其中,row_median是按行计算得到的中位数,column_median是按列计算得到的中位数。

示例

【例】对于如下二维数组,形式如下,利用Python计算其中位数。

关键技术:利用median()函数可以计算中位数,若为偶数个数值,则中位数为中间两个数的均值。

程序代码如下所示:
在这里插入图片描述

众数运算

众数就是一组数据中出现最多的数,代表了数据的一般水平。在Python中通过调用DataFrame对象的mode()函数实现行/列数据均值计算

mode()

pandasmode()函数用于计算数据的众数(即出现频率最高的值),返回一个DataFrame对象。

使用方法:

DataFrame.mode(axis=0, numeric_only=False)

参数说明:

  • axis:指定计算众数的轴,取值为0或1,默认为0。当axis=0时,计算每列的众数;当axis=1时,计算每行的众数。
  • numeric_only:是否只计算数值类型的列,默认为False。当numeric_only=True时,只计算数值类型的列的众数;当numeric_only=False时,包括所有列计算众数。

返回值:

  • DataFrame:包含众数的DataFrame对象。每一列的众数可能包含多个值,返回的DataFrame对象中每一列都是一个Series对象。

注意:

  • DataFrame对象存在多个众数时,mode()函数将返回其中任意一个众数。
  • 如果DataFrame中的所有元素都是唯一的(即不存在众数),则mode()函数将返回一个空的DataFrame
  • 如果DataFrame对象为空,则mode()函数将返回一个与原对象大小相同的空DataFrame

示例:

import pandas as pddata = {'col1': [1, 2, 3, 4, 5],'col2': [1, 2, 2, 3, 4],'col3': [1, 1, 2, 2, 2]}
df = pd.DataFrame(data)print(df.mode())

输出结果:

   col1  col2  col3
0     1     2     2
1   NaN   NaN   NaN

在上面的示例中,DataFrame中的每一列都有一个众数。第一列的众数是1,第二列的众数是2,第三列的众数是2。由于第三列存在两个众数,所以在结果中该列有两个值,而其他列只有一个值。

示例

【例54】计算学生各科成绩的众数。

关键技术: mode()函数实现行/列数据均值计算。
在这里插入图片描述

分位数运算

分位数是以概率依据将数据分割为几个等分,常用的有中位数(即二分位数)、四分位数、百分位数等。分位数是数据分析中常用的一个统计量,经过抽样得到一个样本值。

例如,经常会听老师说: "这次考试竟然有20%的同学不及格! " ,那么这句话就体现了分位数的应用。在Python中通过调用DataFrame对象的quantile()函数实现行/列数据均值计算

quantile()

pandas中的quantile()函数用于计算SeriesDataFrame对象中元素的分位数。分位数是将数值分为几个等分的值,它可以用来描述数据的分布特征。

quantile()函数的语法如下:

DataFrame.quantile(q=0.5, axis=0, numeric_only=True, interpolation='linear')

参数说明:

  • q:要计算的分位数,可以是单个值或列表。默认值为0.5,表示计算中位数。
  • axis:指定计算分位数的轴。默认值为0,表示按列计算分位数。
  • numeric_only:指定是否只计算数值类型的分位数。默认值为True
  • interpolation:指定计算分位数时使用的插值方法。默认值为’linear’,表示线性插值。

下面是一些使用quantile()函数的示例:

  1. 计算中位数:
>>> import pandas as pd
>>> data = pd.Series([1, 2, 3, 4, 5])
>>> data.quantile()
3.0
  1. 计算指定分位数:
>>> data.quantile(0.25)  # 计算第一四分位数
2.0
>>> data.quantile([0.25, 0.75])  # 计算第一四分位数和第三四分位数
0.25    2.0
0.75    4.0
dtype: float64
  1. 计算每列的分位数:
>>> df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]})
>>> df.quantile()
A    3.0
B    8.0
dtype: float64
  1. 指定计算分位数的轴:
>>> df.quantile(axis=1)
0    3.5
1    4.5
2    5.5
3    6.5
4    7.5
dtype: float64
  1. 使用不同的插值方法:
>>> data.quantile(interpolation='lower')  # 低位插值
2.0
>>> data.quantile(interpolation='higher')  # 高位插值
4.0

需要注意的是,quantile()函数会自动忽略缺失值(NaN),并且对于非数值类型的列,会自动进行类型转换。

示例

【例55】通过分位数确定被淘汰的35%的学生。

关键技术:以学生成绩为例,数学成绩分别为120、89、98、78、65、102、112、56、79、45的10名同学,现根据分数淘汰35%的学生,该如何处理?

首先使用quantile()函数计算35%的分位数,然后将学生成绩与分位数比较,筛选小于等于分位数的学生,程序代码如下:
在这里插入图片描述

五、数值排序与排名

Pandas也为Dataframe实例提供了排序功能。Dataframe的排序可以按照列或行的名字进行排序,也可以按照数值进行排序。

sort_values()

pandas库中的sort_values()函数是用于对DataFrame对象或Series对象进行排序的函数。它可以按照指定的列或行的值进行排序操作,并返回一个新的排序后的对象。

sort_values()函数的语法如下:

DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')Series.sort_values(axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')

参数说明:

  • by:指定按照哪一列或行进行排序,默认值为None。可以是字符串、列表、数组、Series或索引对象。如果是字符串,则表示按照该列的值进行排序;如果是列表或数组,则表示按照多个列的值进行排序;如果是Series或索引对象,则表示按照该对象的值进行排序。对于DataFrame对象,还可以使用多个by参数进行多级排序。
  • axis:指定按照列(axis=0)还是行(axis=1)进行排序,默认值为0。
  • ascending:指定排序顺序,默认值为True,表示升序排序;False表示降序排序。
  • inplace:指定是否在原地进行排序,默认值为False,表示返回一个新的排序后的对象;True表示在原地进行排序,不返回新的对象。
  • kind:指定排序算法,默认值为’quicksort’。其他可选值包括’mergesort’和’heapsort’。一般来说,'quicksort’算法效率较高,但在某些情况下可能会出现不稳定的排序结果。如果要保证稳定性,可以使用’mergesort’算法。
  • na_position:指定缺失值的位置,默认值为’last’。其他可选值包括’first’和’last’,表示缺失值在排序结果中的位置。

示例:

import pandas as pddf = pd.DataFrame({'A': [1, 3, 2], 'B': [4, 2, 5]})
print(df.sort_values(by='A'))
print(df.sort_values(by=['A', 'B'], ascending=[False, True]))

上述示例中,首先创建了一个包含两列(AB)的DataFrame对象,然后使用sort_values()函数按照列’A’的值进行升序排序,并打印排序结果。接下来,使用sort_values()函数按照列’A’和列’B’的值进行排序,其中列’A’按照降序排序,列’B’按照升序排序,并打印排序结果。

示例

在这里插入图片描述
按照column列名排序
在这里插入图片描述

axis表示按照行或者列,asceding表=True升序,False为降序,by表示排序的列名。
在这里插入图片描述
在这里插入图片描述

按照数据进行排序,首先按照D列进行升序排列。
在这里插入图片描述

按照数据进行排序,首先按照C列进行降序排序,在C列相同的情况下,按照B列进行升序排序。
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/9585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人脸图像生成(DCGAN)

一、理论基础 1.什么是深度卷积对抗网络&#xff08;Deep Convolutional Generative Adversarial Network&#xff0c;&#xff09; 深度卷积对抗网络&#xff08;Deep Convolutional Generative Adversarial Network&#xff0c;DCGAN&#xff09;是一种生成对抗网络&#xf…

网工内推 | 软件测试工程师,有软考中、高级认证优先

01 上海碧蔓智能科技有限公司 招聘岗位&#xff1a;软件测试工程师 职责描述&#xff1a; 1、负责软件产品的测试工作&#xff0c;对测试进度和测试质量负责&#xff1b; 2、参与业务需求、设计方案的讨论&#xff0c;负责编写测试方案、测试计划、测试用例&#xff0c;搭建测…

LMDeploy笔记

随谈模型部署 模型部署包含的内容很多&#xff0c;来聊聊。 访存bottleneck 首先&#xff0c;基于transformer的计算是访存密集型任务。 so? 过去&#xff0c;我们表达模型的性能&#xff0c;通常会用ops&#xff0c;macs这些指标,也计算量来衡量模型的推理时间&#xff…

JSP ssm 智能水表管理myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 智能水表管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

Vue自定义封装音频播放组件(带拖拽进度条)

Vue自定义封装音频播放组件&#xff08;带拖拽进度条&#xff09; 描述 该款自定义组件可作为音频、视频播放的进度条&#xff0c;用于控制音频、视频的播放进度、暂停开始、拖拽进度条拓展性极高。 实现效果 具体效果可以根据自定义内容进行位置调整 项目需求 有播放暂停…

使用Python实现DataFrame中奇数列与偶数列的位置调换

目录 一、引言 二、背景知识 三、问题描述 四、解决方案 五、案例分析与代码实现 六、技术细节与注意事项 七、扩展与应用 八、封装为函数 九、错误处理与健壮性 十、性能优化 十一、总结与展望 一、引言 在数据处理和分析中&#xff0c;数据框&#xff08;DataFra…

16地标准化企业申请!安徽省工业和信息化领域标准化示范企业申报条件

安徽省工业和信息化领域标准化示范企业申报条件有哪些&#xff1f;合肥市 、黄山市 、芜湖市、马鞍山、安庆市、淮南市、阜阳市、淮北市、铜陵市、亳州市、宣城市、蚌埠市、六安市 、滁州市 、池州市、宿州市企业申报安徽省工业和信息化领域标准化示范企业有不明白的可在下文了…

药物代谢动力学学习笔记

一、基本概念 二、经典房室模型 三、非线性药物代谢动力学 四、非房室模型 五、药代动力学与药效动力学 六、生物等效性评价 七、生物样品分析方法 基本概念 生物样品&#xff1a;生物机体的全血、血浆、血清、粪便、尿液或其他组织的样品 特异性&#xff0c;specificity&…

信息技术自主可控的意义,针对国产化替换,服务器虚拟化或比公有云更具优势

我们之前在文章《博通收购VMware后&#xff0c;经销商和用户如何应对&#xff1f;新出路&#xff1a;虚拟化国产替代&#xff0c;融入信创云生态》中提到&#xff1a; 从信创整体发展和政策标准来看&#xff0c;供应商必须满足两个条件&#xff1a;一是融入国产信息技术生态&am…

FDM3D打印系列——系列模型的身高比例问题

大家好&#xff0c;我是阿赵。   最近又打印了一个拳皇的角色手办&#xff0c;不过在这个过程中&#xff0c;发现了一个不同角色之前比例的问题&#xff0c;和大家分享一下。   这个就是这次打印的模型&#xff0c;估计大家都很熟悉&#xff1a; 没错&#xff0c;就是拳皇…

gif压缩大小但不改变画质怎么做?分享5个压缩GIF原理~

GIF&#xff08;图形互换格式&#xff09;是网络上广泛使用的一种图像格式&#xff0c;因其支持动画而备受欢迎。然而&#xff0c;随着动画越来越复杂和高分辨率&#xff0c;GIF 文件大小也随之增加&#xff0c;可能导致加载速度变慢和带宽消耗增加。在这篇文章中&#xff0c;我…

反着用scaling law验证数据:群聊场景指代消歧

本文作者&#xff1a;白牛 我们之前开源了 LLM 群聊助手茴香豆&#xff08;以下简称豆哥&#xff09;&#xff0c;它的特点是&#xff1a; 设计了一套拒答 pipeline&#xff0c;实用于群聊场景。能够有效抵抗各种文本攻击、过滤无关话题&#xff0c;累计面对 openmmlab 数千用…

Python专题:六、循环语句(1)

补充知识 代码的注释 #描述性文字 阅读代码的人更好的理解代码 while循环语句 x<100条件控制语句&#xff0c;Totalx,Total自增加x&#xff0c;x1&#xff0c;x自增加1&#xff0c;x<100此条件满足时&#xff0c;执行while循环&#xff0c;当x101时&#xff0c;x101条…

# 从浅入深 学习 SpringCloud 微服务架构(十五)

从浅入深 学习 SpringCloud 微服务架构&#xff08;十五&#xff09; 一、SpringCloudStream 的概述 在实际的企业开发中&#xff0c;消息中间件是至关重要的组件之一。消息中间件主要解决应用解耦&#xff0c;异步消息&#xff0c;流量削锋等问题&#xff0c;实现高性能&…

【图像增强(空域)】基于直方图增强的图像增强及Matlab仿真

1. 摘要 图像的灰度直方图表示灰度图像中具有每种灰度像素的个数&#xff0c;反映了图像中每种灰度级出现的频率&#xff0c;是图像的基本统计特征之一。直方图均衡方法因为其有效性和简单性已成为图像对比度增强的最常用的方法。其基本思想是根据输入图像的灰度概率分布来确定…

【全开源】Java外卖霸王餐免费吃外卖小程序+APP+公众号+H5多端霸王餐源码

一、特色功能 霸王餐活动管理&#xff1a;允许商家发布和管理霸王餐活动&#xff0c;包括设置活动时间、具体优惠、活动规则等。用户参与与浏览&#xff1a;用户可以在小程序中浏览霸王餐活动列表&#xff0c;查看活动的详情信息&#xff0c;如商品或服务的免费赠送、活动规则…

原生微信小程序canvas签名功能

半个月前百度搜出来的&#xff0c;没存书签现在不知道是哪篇文章了&#xff0c;再搜也没搜出来那篇文章&#xff0c;还好当时把代码复制到本地跑了一下&#xff0c;现在再发csdn存一下。 sign.js Page({data: {ctx: null,width: null,height: null,drawCount: 0,drawState: &…

查找本机上的WIFI并查看密码。

在命令行模式下&#xff1a; 1。WIN 键 R&#xff0c;输入CMD&#xff0c;回车确认 2。在搜索框输入CMD&#xff0c;回车确认 以上的方法都可以打开命令行模式。也称终端&#xff0c;或者DOS模式。 查找本机上的WIFI密码&#xff0c;命令行如下&#xff1a; 首先&#xff…

汉诺塔问题和爬楼梯(递归)

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 c语言基础_LaNzikinh篮子的博客-CSDN博客 文章目录 一.爬楼梯问题二.汉诺塔问题总结 一.爬楼梯问题 假设你正…

Unity使用ToggleGroup对多个Toggle进行管理时,初始化默认选项失效的问题

问题描述&#xff1a; 在unity脚本的OnEnable中用代码设置Toggle集合中的其中一个对象的ison时&#xff0c;发现并没有根据设置发生变化。但是该Toggle的OnValueChange却发生过变化。 如果使用协程等待0.01s,那么对应组件的ison的修改才能生效&#xff0c;但是逐帧分析的话会发…