数据分析三剑客:
一、能说出NumPy、Pandas、Matplotlib的关系:
NumPy是底层数值计算基础:
NumPy提供了高效的多维数组和数值计算能力,是后两者的基础,比如Pandas里的DataFrame底层存储的其实就是NumPy数组。Pandas 的数值运算(像求均值、求和)最终都是调用 NumPy 的函数来实现的。
Pandas 是基于它做结构化数据分析的:
Pandas是中层工具,它在NumPy的基础上,把数组包装成了更适合业务分析的表格结构,(Series 是单列数组,DataFrame 是多列表格),还加了索引、列名这些方便理解的信息,更适合处理结构化数据。
Matplotlib 靠前两者提供的数据做可视化。
Matplotlib就是上层展示,它可以直接接收?NumPy数组或者Pandas的Series/DataFrame 作为数据源,把数据转换成图表(比如折线图、散点图),相当于把前两者处理好的数据可视化出来,方便直观理解。
简单说就是:NumPy 负责 "算得快",Pandas 负责 "用得顺",Matplotlib 负责 "看得懂",三者是从底层计算到中层处理再到上层展示的递进关系。
二、掌握Numpy数组创建操作:np.array() 或者 np.random.randn()
- 这块我用得很多:
-
用
np.array()的话,既可以把Python的列表转成数组(比如np.array([1,2,3])生成一维数组,np.array([[1,2],[3,4]])生成二维数组),也能指定数据类型(比如加dtype=np.float32把数据存成浮点型,节省内存)。 -
用
np.random.randn()是生成服从标准正态分布的随机数组,比如np.random.randn(3,4)就能生成3行4列、均值0、标准差1的随机浮点数;如果是生成整数随机数组,我也常用np.random.randint(0,10,size=(2,3))(生成0到10之间的整数,2行3列)。另外像生成全0数组(
np.zeros())、全1数组(np.ones())这些常用的创建方式,我也都很熟练。
三、了解numpy数组的相关操作:属性、索引、形状、运算
-
属性 :比如看数组的形状用
arr.shape,看数据类型用arr.dtype,看数组元素个数用arr.size,这些属性能帮我快速了解数组的基本信息。arr.ndim是数组的维度。 -
索引 :
一维数组直接用
arr[0]取第一个元素;二维数组可以用arr[1,2]取第2行第3列,也能切片(比如
arr[0:2, 1:3]取前2行、第2到3列的区域);如果是条件索引,比如
arr[arr>5]可以直接取出数组中大于5的元素。 -
形状调整 :比如用
arr.reshape(2,6)把原来的数组改成2行6列,arr.T数组的转置。或者用
arr.flatten()把多维数组转成一维,这些在数据格式不匹配的时候经常用。 -
运算 :
数组之间可以直接做加减乘除(比如
arr1 + arr2),也能和标量运算(比如arr * 2);矩阵乘法:公式:(m,p)*(p,n) = (m,n) API:np.dot
另外像求均值
np.mean(arr)、求和np.sum(arr)、求最大值np.max(arr)这些统计运算,我也会根据需求用(比如np.sum(arr, axis=0)是按列求和,axis=1是按行求和)。
四、能说出Pandas中Series和DataFrame的联系
我很清楚这两者的关系:
首先Series是Pandas里的"单列数据结构"------它像是带索引的一维数组,既有数据值,也有对应的索引(可以是默认的数字索引,也能自己指定比如日期、名称)。
而DataFrame是"多列表格结构"------它可以理解成是由多个Series"拼"起来的,每一列都是一个Series,并且这些Series共享同一个行索引。
举个例子:如果我有一个存"用户年龄"的Series和一个存"用户消费"的Series,把这两个Series按列组合起来,就能得到一个包含"年龄""消费"两列的DataFrame;反过来,从DataFrame里取某一列(比如df['年龄']),得到的就是对应的Series。
所以两者的核心联系是:DataFrame是Series的容器,Series是DataFrame的组成单元。
五、掌握DataFrame对象的创建操作:从文件读取或者列表/字典等转换
- 这些创建方式我都常用:
-
从文件读取 :比如读CSV文件用
pd.read_csv('文件路径.csv'),读Excel文件用pd.read_excel('文件路径.xlsx'),还能指定参数(比如sep='\t'指定分隔符、usecols=[0,2]只读取第1和第3列)。 -
用列表/字典创建 :如果是字典,比如
pd.DataFrame({'姓名':['张三','李四'],'年龄':[20,25]}),字典的键会变成列名,值会变成对应列的数据;如果是列表嵌套列表,比如pd.DataFrame([['张三',20],['李四',25]], columns=['姓名','年龄']),需要手动指定列名。另外像从NumPy数组创建(
pd.DataFrame(np.random.rand(3,2), columns=['列1','列2'])),或者从数据库查询结果创建,这些方式我也用过。
六、熟悉DataFrame的相关操作:选择、筛选、缺失值、分组聚合
- 这些都是我日常分析的核心操作:
-
选择 :选列可以用
df[['列名1','列名2']],选行可以用df.loc[行索引]或者df.iloc[行号]。 -
筛选 :比如筛选"年龄>20"的行用
df[df['年龄']>20],多条件筛选(比如"年龄>20且消费>100")用df[(df['年龄']>20) & (df['消费']>100)]。 -
缺失值处理 :先用
df.isnull().sum()统计每列的空值数量,然后根据情况处理------比如用df.dropna()删除有空值的行,或者用df.fillna(df['列名'].mean())把空值填充成该列的均值。 -
分组聚合 :比如按"性别"分组求"消费"的均值,用
df.groupby('性别')['消费'].mean();如果要同时求均值和总和,就用df.groupby('性别')['消费'].agg(['mean','sum'])。 -
**数据透视表:**pivot_table()
七、能够使用Matplotlib绘制简单的折线图和散点图
这两种图我经常用:
-
折线图 :比如画"日期-销量"的折线图,先导入库
import matplotlib.pyplot as plt,然后用plt.plot(df['日期'], df['销量']),再加上plt.xlabel('日期')(x轴标签)、plt.ylabel('销量')(y轴标签)、plt.title('每日销量趋势')(标题),最后用plt.show()显示图表。 -
散点图 :比如画"年龄-消费"的散点图,用
plt.scatter(df['年龄'], df['消费']),同样可以加标签和标题,还能通过c参数指定点的颜色(比如c='red'),通过s参数调整点的大小。如果是从Pandas的DataFrame取数据,直接把Series传进去就行,不用额外转格式。