Python常见面试题(二)——numpy和pandas

一、NumPy和Pandas间的区别与练习

  • 功能定位

NumPy主要用于数值计算,提供了多维数组对象ndarray,支持数组操作线性代数随机数生成等功能。
 Pandas则建立在NumPy之上,提供了更高级的数据结构,主要用于数据分析,尤其是处理表格化数据。

  • 数据结构

NumPy的核心是多维数组对象ndarray,它可以表示任意维度的数组。
Pandas提供了两种主要的数据结构:Series(一维标记数组)和DataFrame(二维带标签的数据表)。

  • 索引方式

NumPy的数组只能使用整数索引访问元素。
Pandas的Series和DataFrame可以使用标签索引(如列名或行名)来访问数据,也可以通过整数位置索引访问。

  • 擅长领域

NumPy特别擅长处理矩阵运算、数值计算等任务。
Pandas适合处理结构化的数据,如数据清洗、数据选择、数据转换等操作。

  • 对缺失数据的处理

NumPy的数组不支持缺失数据,通常会用特殊值(如NaN)表示。

Pandas中的Series和DataFrame提供了更便捷的方法来处理缺失数据,如填充缺失值、删除缺失值等。

  • 其他区别

NumPy 比 Pandas 更快且内存效率更高。

NumPy 主要用于数值计算,而 Pandas 用于更广泛的用途,例如数据分析和可视化。

NumPy 支持使用矩阵和数组数据格式,其中 Pandas 可以与表数据、Excel 文件、CSV 文件等一起使用。

NumPy 使用数组作为其主要对象,并且默认情况下也不索引。Pandas 使用系列和数据框作为其主要对象,并默认提供索引。

联系:

DataFrame 的列是 Series 对象,可以通过列索引对列进行访问和操作。

二、numpy

【介绍】

NumPy 是 Python 中的科学计算包/库。它提供了一个多维的数组对象以及多个派生对象,例如屏蔽数组和矩阵。NumPy 包的核心是ndarray 。它负责封装同质数据类型的 n 维数组,提供优化的代码编译,使其性能非常好。它从根本上用于执行数学和逻辑运算、实现基本线性代数、操作数组形状、排序和选择、I/O、执行离散傅立叶变换等。

【使用numpy的原因及其优势】

快:虽然 Python 列表也是数组,但这些列表的处理时间比 NumPy 数组慢 50 倍,使其成为执行数值和科学计算的最流行的库。(列表存储在随机内存位置,需要更长的时间来访问和处理;NumPy 数组作为 ndarray 存储在一个连续的内存位置,使得操作和计算非常高效和优化)

便利:在 NumPy 中,数组对象称为ndarray,它提供了许多附加功能,使其更快、更易于使用。

1、列表与numpy的区别

  • Python 列表可以动态增长,而 NumPy 数组在创建时的大小是固定的。因此,当我们更改ndarray的大小时,它会删除原始数组并创建一个新数组。
  • 在计算高级数学和包含大量数据的各种其他类型的运算时,NumPy 的性能要高得多。使用 Python 进行计算需要更多代码,而且效率不如 NumPy。
  • NumPy 数组的所有元素的数据类型都相同,因此与 Python 数组不同,它占用固定的内存大小。然而,有一个例外,即可以拥有对象数组(Python 以及 Numpy),允许数组使用不同大小的元素。
  • 许多科学界使用基于 Python 的软件包进行高级计算,其中都包含 NumPy 数组。基于 Python 的序列通常会在预处理数据时转换为 NumPy 数组,并将结果输出为 NumPy 数组。因此,编写高效的基于 Python 的科学计算需要 NumPy 数组的知识。

2、narray的重要属性

  • ndarray.shape – 它输出数组维度。对于包含n 行m 列的矩阵,形状将为(n, m)。要获取给定 array 的轴数请使用 ndarray.ndim 。
  • ndarray.dtype – 它描述数组中包含的元素的数据类型。我们还可以使用标准 Python 指定数据类型。NumPy 还提供了自己的附加数据类型。其中一些示例是numpy.int16、numpy.int32numpy.float64
  • ndarray.itemsize – 它输出给定数组的每个元素的大小(以字节为单位)。它与使用ndarray.dtype.itemsize相同。举例来说,我们有一个包含float64类型元素的数组。它的项目大小将为8 ,这是64/8的结果。另一种情况是当包含的数据类型是complex32时。它的项目大小将为4,即32/8
  • ndarray.data – 它返回保存数组的内存位置或缓冲区。它不经常使用,因为我们使用索引作为对该内存位置的引用来获取数组中包含的元素。

3、NumPy 中的通用函数

exp、sin、cos、add、sqrt等数学函数在 Numpy 中称为通用函数ufunc 

4、解释 NumPy 中的术语“广播”

每当我们有不同维度的数组时,NumPy 都会以统一的方式处理它们,同时执行算术、函数、按位以及逻辑运算。这称为广播。它用于解释逐个元素隐式完成的操作行为。

5、如何将一维数组转换为二维数组?

使用NumPy 提供的np.newaxisnp.expand_dims函数。

6、解释NumPy 中复制视图之间的主要区别

当我们在numpy中使用copy() 函数时,它会创建一个全新的数组。我们在原始数组中所做的更改不会反映在其复制版本中。另一方面,view()函数只是原始数组的反射。无论我们在原始数组中进行什么更改,也都将在使用视图函数调用的数组中实现。

7、用numpy创建DataFrame

#数组创建
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#用np创建dataframe
frame4 = pd.DataFrame(np.arange(9).reshape(3, 3),
                     index=['a', 'c', 'd'],
                     columns=['Ohio', 'Texas', 'California'])

三、pandas

3.1、pandas中的series

【定义】一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。

1、series的建立【列表、字典】、读取、改变(值和索引)、计算、找索引是否在、检查缺失值、命名、对其并执行运算

#建立
obj = pd.Series([4, 7, -5, 3])
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
#查询
obj.values
obj.index
obj4.name
obj4.index.name
#运算
import numpy as np
np.exp(obj2)
#####in是看索引
'b' in obj2#false
#看空
pd.isnull(obj3)
obj4.isnull()#类方法

2、索引

Pandas 中的 Series 的索引(index)实际上是一个包含每个元素标签的对象,这个对象的数据类型是 pd.Index。在索引为数字 0 1 2 3 的 Series 中,这些标签是整数,而在以字母 a b c d 为索引的 Series 中,这些标签是字符串。从数据处理角度来看,这两种类型的索引都能够进行各种类型的计算和处理。 但是在实际应用中,这两种类型的索引可能存在差异,例如在使用 loc 或 iloc 进行索引时,整数索引可能会造成歧义,因为整数索引和行号索引的用法相同而且重合。在这种情况下,最好使用明确的字符串标签作为 Series 的索引。

3.2、pandas中的DataFrame

DataFrame就像SPSS的数据文件、R的数据框,SAS的dataset

1、dataframe的建立——利用字典

#建立
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 
        'year': [2000, 2001, 2002, 2001, 2002, 2003], 
        'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}

frame = pd.DataFrame(data)
frame.head()
#通过指定列名顺序,可以改变变量顺序
pd.DataFrame(data, columns = ['year', 'state', 'pop'])   
#指定行列标签
frame2 = pd.DataFrame(data, columns = ['year', 'state', 'pop', 'debt'], 
                      index = ['one', 'two', 'three', 'four', 'five', 'six'])
pop = {'Nevada': {2001: 2.4, 2002: 2.9, 2003:3.2},
       'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = pd.DataFrame(pop)#2001是行索引 

2、DataFrame的索引

包含行索引和列索引

#行列索引——先取列再取行
#-1就是最后一行
frame3['Nevada'][:2]

#读取列——左行右列
frame2.iloc[1:3,]
#loc是靠label定位或者布尔值,iloc是按照整数的顺序定位
frame2.iloc[1:3,0:2]


bool_arr=frame2['pop']>2
result =frame2.loc[bool_arr,]

也可以用切片

3、其他

命名:

#命名和单元格值
frame3.index.name = 'year'; frame3.columns.name = 'state'
frame3.values#这样输出的是会是数组

 删除

del frame2['year']

自动识别缺失

series合进DataFrame
把series赋给DataFrame,会按DataFrame的index来合并,不够的地方用缺失数据来表示:

frame2['debt'] = val

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值