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

news2024/11/25 12:23:57

数据的选择和运算

  • 前言
  • 一、数据选择
    • 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 pd

df1 = 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 pd

df1 = 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 pd

df1 = 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 np

arr = np.array([1, 2, 3, 4, 5])
sum_result = np.sum(arr)
print(sum_result)  # 输出:15

arr2 = 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 np

arr = np.array([1, 2, 3, 4])
result = np.prod(arr)
print(result)  # 输出24

arr2 = 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 pd

data = {'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 pd

data = {'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 pd

df = 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.coloradmin.cn/o/1660308.html

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

相关文章

一篇文章,系统性聊聊Java注解

你好&#xff01; 这类系统性聊聊***知识点的文章&#xff0c;是希望给大家带来对某个技术的全貌认识&#xff0c;如果大家喜欢&#xff0c;后续可以陆续更新此系列 下面&#xff0c;开始今天的分享 在之前&#xff0c;我们已经分享过注解相关的三个面试题&#xff0c; 今天的…

【原创教程】步进MC_HOME回原点模式

我们所用软件:西门子TIA Portal V16编程软件 我们所用硬件:S7-1200系列:CPU1212C;雷赛科技DM542驱动器;西门子TP900 comfort触摸屏 我们的硬件接线 MC_HOME的模式: 一般情况下,西门子PLC的运动控制在使能绝对位置定位之前必须执行“回原点”或是“寻找参考点”。 Pos…

多层感知机(MLP)示例

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个多层感知机模型pytorch程序,最后打印5个条件分别的影响力。 一 在多层感知机&#xff08;MLP&#xff09;模型中&…

RabbitMQ部署指南.md

RabbitMQ部署指南 1.单机部署 我们在Centos7虚拟机中使用Docker来安装。 1.1.下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3.8-management方式二&#xff1a;从本地加载 在课前资料已经提供了镜像包&#xff1a; 上传到虚拟机中后&#xff0c;使用命令加载…

超详细的胎教级Stable Diffusion使用教程(一)

这套课程分为五节课&#xff0c;会系统性的介绍sd的全部功能和实操案例&#xff0c;让你打下坚实牢靠的基础 一、为什么要学Stable Diffusion&#xff0c;它究竟有多强大&#xff1f; 二、三分钟教你装好Stable Diffusion 三、小白快速上手Stable Diffusion 四、Stable dif…

【网络安全入门】新手如何参加护网行动?一篇带你零基础入门到精通

前言 “没有网络安全就没有国家安全”。 当前&#xff0c;网络安全已被提升到国家战略的高度&#xff0c;成为影响国家安全、社会稳定至关重要的因素之一。 一、网络安全行业特点 行业发展空间大&#xff0c;岗位非常多 网络安全行业产业以来&#xff0c;随即新增加了几十个…

Django 管理员登录安全 OTP双因素认证

目前安全双因素 最基本的&#xff0c;django管理员 默认直接登录的。 本项目环境:Django 2.0.13django-otp 0.9.3 1 安装pip3 install django-otp0.9.3 2 配置文件 vim api_statistics/settings.py INSTALLED_APPS里增加django_otp,django_otp.plugins.otp_totp,MIDDLEWARE…

出海企业必备神器:海外云手机的秘密你了解多少?

在全球化日益加速的今天&#xff0c;出海企业面临着前所未有的机遇与挑战。如何才能以一个较低的成本打入海外市场&#xff0c;实现业务的高速增长&#xff1f;答案就是——海外云手机&#xff01; 一、为何海外云手机成为出海企业的必备神器&#xff1f; 突破地域限制&#xf…

videosapi、强大的微信管理api

接口地址&#xff1a;videosapi.com 同步个人收藏夹 {"appId": "{{appid}}","syncKey": "" } 出参 {"ret": 200,"msg": "操作成功","data": {"syncKey": "CAESCAgBEJyi9e4…

Python扫描发送邮件

一、具体要求 编写 python 代码&#xff0c;扫描指定的目录下的所有文件&#xff0c;将这些扫描的文本内容邮 件发送到指定邮箱( 自己的 qq 邮箱 ) 示例如下&#xff1a; 使用QQ邮箱SMTP服务器需要获取QQ邮箱授权码&#xff0c;获取方式可参考以下链接&#xff1a; 电子邮件 二…

【千帆平台】使用AppBuilder零代码创建应用,然后通过OpenAPI方式调用应用

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建API密钥调用文档调用说明API服务域名通信协议字符编码公…

企业短信群发被拦截的原因

企业短信群发作为一种高效的营销手段&#xff0c;被越来越多的企业所采用。也经常会面临被拦截的问题&#xff0c;这给企业带来了沉重的损失。本文将探讨企业群发被拦截的原因&#xff0c;并寻找解决办法。 频率过高 频率过高是导致企业群发被拦截的常见原因之一。当企业的频率…

淘宝扭蛋机小程序开发:探索未知,扭出惊喜

一、引领潮流&#xff0c;创新体验 在淘宝这片购物海洋中&#xff0c;我们总是寻求为您带来不一样的惊喜和乐趣。今天&#xff0c;我们正式推出淘宝扭蛋机小程序&#xff0c;将传统扭蛋的趣味与电商购物的便捷完美结合&#xff0c;为您带来前所未有的购物新体验。 二、扭蛋机…

摩菲Murphy显示器显示表 总线编程器维修PV780B

Murphy仪器维修包括&#xff1a;摩菲数字显示器&#xff1b;摩菲监视仪表&#xff1b;摩菲CAN总线控制器等维修 维修故障包括&#xff1a;黑屏、指示灯无显示&#xff0c;触摸屏上电无反应&#xff0c; 上电蓝屏、白屏&#xff0c;通电几分钟后屏幕变为蓝屏&#xff0c;主板故…

vue2后台管理项目

一:项目准备 1)拉取模板代码 远程仓库复制到本地仓库. 2)安装后的项目 路径 code 文件夹 会打开vscode的文件夹. 3)安装vetur和eslint插件可以保存时自动修改不规范的地方. 4)App内有一级路由,路由组件导入如果是layout架子,会导入的是文件夹下的index.js没有则导入index.v…

副业兼职没那么难,视频号带货,1天稳定500,适合新手操作

向大家推荐一个项目&#xff1a;视频号书单号带货玩法。我已经实践了一段时间&#xff0c;并成功售出了1200多单&#xff0c;赚取了2万多元。这个项目表现相当出色&#xff0c;强烈推荐给大家&#xff01; 周周近财&#xff1a;让网络小白少花冤枉钱&#xff0c;赚取第一桶金 …

使用Three.js开发一个3D案例Demo

使用Three.js开发一个3D案例 最近在找工作&#xff0c;发现好多招聘要求都需要会Three.js&#xff0c;以前接触比较多的是2D开发&#xff0c;也就是平面开发&#xff0c;用到的做多的技术就是d3.js&#xff0c;现在3D开发已经成为了大势所趋&#xff0c;所以就学习下Three.js。…

我国结肠镜市场规模逐渐扩大 国产化率有所增长

我国结肠镜市场规模逐渐扩大 国产化率有所增长 结肠镜是专用于检查结肠内部的医疗器械&#xff0c;属于内窥镜的细分品类之一。结肠镜具有特殊的设计&#xff0c;可以检查结肠壁的状态、寻找肠道中的异常病变和息肉等&#xff0c;在筛查结肠癌、检测炎症性肠病等方面发挥着十分…

【深度学习Labelme】使用Segment Anything Model (SAM)快速打标,labelme多边形转yolo txt框看看对不对

文章目录 windows安装环境打开labelme自动保存勾选上&#xff0c;保存图片数据不要勾选选SAM精准模型&#xff0c;然后打开图片路径&#xff0c;然后点击创建AI多边形&#xff1a;鼠标点击确认物体控制点&#xff0c;确认完成后&#xff0c;双击鼠标完成选取&#xff0c;并给上…

各种数据获取stream流的方式

1.单列集合&#xff08;直接调用&#xff09; ArrayList<Integer> list new ArrayList<>();list.stream(); 2.双列集合 HashMap<String, Integer> map new HashMap<>();map.put("aaa",111);map.put("bbb",222);map.put("c…