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 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列进行升序排序。
在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

天地图2024版正式启用!首次开放多时相影像专题,可直接查看历史影像

近日&#xff0c;国家基础地理信息中心正式发布了天地图2024版。 新版本更新2米分辨率遥感影像794万平方公里、优于1米分辨率遥感影像655万平方公里&#xff0c;在线服务2米分辨率遥感影像覆盖全部陆地国土、优于1米遥感影像覆盖陆地国土达到98%&#xff0c;同时新增多时相遥感…

航空科技:探索飞机引擎可视化技术的新视界

随着航空技术的飞速发展&#xff0c;飞机引擎作为航空器最为关键的部件之一&#xff0c;其性能直接影响到飞机的安全性、经济性和环保性。因此&#xff0c;飞机引擎可视化技术的应用日益成为航空行业研究和发展的热点。 通过图扑将复杂的飞机引擎结构和工作原理以直观、生动的…

Linux中的日志系统简介

在的Linux系统上使用的日志系统一般为rsyslogd。rsyslogd守护进程既能接收用户进程输出的日志&#xff0c;又能接收内核日志。用户进程是通过调用syslog函数生成系统日志的。该函数将日志输出到一个UNIX本地域socket类型&#xff08;AF_UNIX&#xff09;的文件/dev/log中&#…

动联再掀创新风潮!P92 Max智能POS机惊艳发布

当下&#xff0c;智能支付与零售行业正经历着深刻变革&#xff0c;移动支付、无人支付等新型支付方式在我国广泛应用&#xff0c;显著优化了消费者的支付体验&#xff0c;同时也为零售行业带来新的发展契机。动联&#xff0c;凭借其在身份认证领域的深厚技术底蕴与创新精神&…

CRM客户关系管理系统源码部署/售后更新/搭建上线维护

基于ThinkPHPFastAdmin开发的CRM客户关系管理系统&#xff0c;专门为企业销售团队量身定制的工具&#xff0c;它能够有效地管理跟进客户&#xff0c;提高销售业绩&#xff01;提供无加密源代码&#xff0c;可以自行根据不同企业的需求进行开发定制。Uniapp版本(高级授权)支持编…

微服务保护-学习笔记

微服务保护 1 Sentinel入门1.1 雪崩问题1.1.1 什么是雪崩问题1.1.2 如何解决雪崩设置超时时间仓壁模式熔断降级限流&#xff08;预防措施&#xff09; 1.2 服务保护技术对比1.3 Sentinel介绍与安装Sentinel 特征Sentinel 安装 1.4 Sentinel整合微服务 2 流量控制3 熔断隔离和降…

【通信协议解析】WiFi协议解析

WiFi协议解析 一、发展由来 Wi-Fi&#xff0c;又称“无线网络”&#xff0c;是Wi-Fi联盟的商标&#xff0c;一个基于IEEE 802.11标准的无线局域网技术。“Wi-Fi”常写作“WiFi”或“Wifi”&#xff0c;但是这些写法并没有被Wi-Fi联盟认可。Wi-Fi产品经由Wi-Fi联盟的一家独立授…

MT7516A-ASEMI变频器专用MT7516A

编辑&#xff1a;ll MT7516A-ASEMI变频器专用MT7516A 型号&#xff1a;MT7516A 品牌&#xff1a;ASEMI 封装&#xff1a;MT-5 最大重复峰值反向电压&#xff1a;1600V 最大正向平均整流电流(Vdss)&#xff1a;75A 功率(Pd)&#xff1a;大功率 芯片个数&#xff1a;5 引…

数据结构与算法学习笔记八-二叉树的顺序存储表示法和实现(C语言)

目录 前言 1.数组和结构体相关的一些知识 1.数组 2.结构体数组 2.二叉树的顺序存储表示法和实现 1.定义 2.初始化 3.先序遍历二叉树 4.中序遍历二叉树 5.后序遍历二叉树 6.完整代码 前言 二叉树的非递归的表示和实现。 1.数组和结构体相关的一些知识 1.数组 在C语…

百倍潜力股Aleo即将上线,布局正当时!牛市来时,你得有币!

前言 在加密货币市场&#xff0c;2024年被众多市场专家预测为迎来新一轮牛市的关键年份。这一预测背后&#xff0c;潜藏着多种可能推动牛市的因素。其中&#xff0c;下一次比特币&#xff08;BTC&#xff09;的减半事件&#xff0c;以及2024年 BTC 现货ETF的推出&#xff0c;都…

二叉树-堆

树 在数据库中&#xff0c;树是一种数据结构&#xff0c;用于组织和存储数据&#xff0c;使得可以高效地进行插入、删除和查找操作。它通常用于表示层次关系或者有序集合。 基本概念 节点&#xff1a;树结构中的每个元素都称为节点。 根节点&#xff1a;树的最顶端节点。 子…

智能奶柜:健康生活新风尚

智能奶柜&#xff1a;健康生活新风尚 在快节奏的都市生活中&#xff0c;健康与便利成为了现代人的双重追求。而在这两者交汇之处&#xff0c;智能奶柜应运而生&#xff0c;它不仅是科技与生活的完美融合&#xff0c;更是日常营养补给的智慧之选。 清晨的第一缕温暖 —— 新鲜…

《应用现代化技术能力成熟度评估模型》介绍

在中国软件行业协会、应用现代化产业联盟以及中国电子技术标准化研究院的指导下&#xff0c;产业多家企业共同支持和参与下&#xff0c;完成的《应用现代化技术能力成熟度评估模型》标准。该标准从应用敏捷、稳定可靠、安全可信、业务智能、成本优化五大维度及22个能力项来评估…

【Linux系统编程】第十四弹---进度条

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、回车和换行 2、观察回车换行现象 3、缓冲区 4、usleep和fflush函数 5、简单倒计时 6、进度条 6.1、版本一 6.2、版本…

基于Python的数据分组技术:将数据按照1, 2, 3规则分为三个列表

目录 一、引言 二、数据分组原理与意义 三、案例分析 四、代码实现与解释 五、对新手友好的解释 六、技术细节与扩展 七、实际应用场景 八、总结 一、引言 在数据处理和分析的广阔领域中&#xff0c;数据分组是一项基础且重要的任务。数据分组通常指的是将数据集中的元…

最新版在线客服系统源码

源码介绍 首发最新在线客服系统源码&#xff0c;优化更好并且重构源码布局UI 性能不吃cpu并发快,普通1H2G都能带动最新版只要是服务器都能带动 搭建即可使用,操作简单,易懂 修复了老版本bug 内附有搭建教程 gofly.v1kf.com 运行环境 Nginx 1.20 MySQL 5.7 演示截图

双筒水封式防暴器有诚信才会被信赖

选择一款满意的产品&#xff0c;始于需求&#xff0c;终于品质&#xff0c;有品质才会热爱&#xff0c;有诚信才会被信赖 一、用途介绍&#xff1a; STFB型双筒水封式防爆器属于双罐结构的水封式防爆器&#xff0c;安装在抽放瓦斯泵吸气侧和排气端的管路上靠防爆器底部的水封保…

使用Docker安装Nginx

一、Nginx介绍 Nginx 是一款高性能的开源 Web 服务器和反向代理服务器&#xff0c;具有高效能、高稳定性、低资源消耗等优点。可以处理大量并发请求&#xff0c;支持多种协议&#xff0c;还能实现负载均衡、缓存等功能&#xff0c;在互联网应用中被广泛使用。在Nginx中&#xf…

ros 学习记录(二)URDF小车运动控制

URDF小车运动控制 准备工作创建 robot_xacro.launch 接上文&#xff0c;想用键盘控制小车在Gazebo中移动。 准备工作 名称版本ROSNoeticGazebo11.11.0 创建 robot_xacro.launch 通过运行这个launch文件&#xff0c;可以启动Gazebo仿真环境&#xff0c;并在仿真环境中加载和…

Redis实现延迟队列(为订单超时关闭提供更多的解决方案)

电商场景中的问题向来很受面试官的青睐&#xff0c;因为业务场景大家都相对更熟悉&#xff0c;相关的问题也很有深度&#xff0c;也有代表性&#xff0c;能更方便地考察候选人的技术水平。 比如商品购买下单支付的流程&#xff0c;在买家购买商品后会先生成订单&#xff0c;之后…