numpy与pandas的基础学习例子

简介: numpy与pandas的基础学习例子
# -*- coding:utf-8 -*-
# @author:Ye Zhoubing
# @datetime:2022/11/11 10:39
# @software: PyCharm
# numpy与pandas的基础学习
"""
# numpy属性
import numpy as np
array1 = np.array([[1,2,3],
                   [2,3,4]]) # 定义一个数组
print(array1)
print(array1.ndim) # ndim属性是维数
print(array1.shape) # shape属性为行列数,第一个数为行,第二个数为列
print(array1.size) # size属性为总元素个数
"""
"""
# numpy的创建array
import numpy as np
a = np.array([2,3,4]) # ar ray来创建一维数组,数组与列表不同:数组没有逗号分割
a2 = np.array([2,3,4],dtype = np.int) # 定义数组类型为整型np.int32,还有np.float
print(a2.dtype)
a3 = np.array([[2,3,4],
             [2,3,4]]) # 二位数组(矩阵)
a4 = np.zeros((3,4)) # 生成一个三行四列的0矩阵
a4 = np.zeros((2,3,4)) # 生成2层3行4列的0矩阵
a5 = np.ones((3,4)) # 生成一个三行四列的1矩阵,类似的还有empoty,arrange
a6 = np.arange(10,20,2) # 默认一维,从10开始,到20(不包括20),步长为2
a7 = np.arange(12).reshape((3,4)) # 默认步长为1,从0开始,到11;reshape()重新分为3行4列
a8 = np.linspace(1,10,5) # 将1到10取等距离的5个点,1为起点,10为终点
"""
"""

# numpy的基础运算
# 轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。
# 简单记忆:axis=0代表往跨行(down),而axis=1代表跨列(across)
import numpy as np
a = np.array([1,2,3])
b = np.array([1,2,3])
c = a - b # c的结果为a与b对应位置元素相减生成的数组,其他运算也是一样的,三角函数类似可以np.sin(a)
print(b<3) # 返回数组,小于3的元素位置显示为true,其它为false
d = np.array([[1,2],
              [1,2]])
e = np.array([[1,2],
              [1,2]])
c1 = d*e # 矩阵对应位置元素相乘,若一个是矩阵,另一个是数,就是矩阵中的每个元素乘以这个数
c_dot = np.dot(d,e) # 线性代数中矩阵乘法,还可以这么写:c_dot = a.dot(b);dot 函数用于矩阵乘法,对于二维数组,它计算的是矩阵乘积,对于一维数组,它计算的是内积 
f = np.random.random((2,4)) # 随机生成2行4列,值在0~1之间的矩阵
np.sum(f) # 矩阵所有元素求和
np.sum(f,axis=1) # axis表示维度,这里axis=1表示每列求和
np.min(f) # 矩阵求最小值
np.min(f,axis=0) # 矩阵求每行最小值
np.max(f) # 矩阵求最大值
# 不止二维,可以多维
"""
"""

# numpy的基础运算2
import numpy as np
a = np.arange(2,14).reshape((3,4)) # 2到13
np.argmin(a) # a矩阵最小值索引,返回的均是一个数(如果a是二维数组,会将数据平铺成一维)
np.argmax(a) # a矩阵最大值索引
np.mean(a) # a矩阵所有元素平均值,还可以:a.mean()
np.average(a) # a矩阵所有元素平均值,还可以加权平均
np.median(a) # a矩阵中所有元素中位数
np.cumsum(a) # a矩阵中累加,新矩阵第一个位置是原来的值,第二个是原来第一个加原来第二个,新第三个=原第一+原第二+原第三,以此类推
np.cumsum(a) # a矩阵相邻元素差,新第一个=原第二个-原第一个,新第二个=原第三个-原第二个,最右边只有一个元素的话就不运算,不放入新矩阵,结果3x3矩阵
np.nonezero(a) # 查看a矩阵中非0元素位置索引,第一个数组为行,第二个数组为列,一一对应
np.sort(a) # a矩阵每行按由小到大的顺序排序
np.transpose(a) # a矩阵的转置矩阵,也可以:a.T
np.clip(a,5,9) # a矩阵中所有小于5(包括5)的数变为5,所有大于9的数(包括9)变为9,其他的不变
"""
"""

# numpy的索引,索引从0开始
a = np.arange(3,15)
print(a[3]) # 即a矩阵第四个元素
a2 = np.arange(3,15).reshape((3,4))
print(a2[2]) # 输出的是第三行
print(a2[1][1]) # 输出第一行第一列的元素,也可以:print(a2[1,1])
print(a2[1,:]) # 输出第一行所有元素
print(a2[1,1:2]) # 输出第一行,第一、二列的所有元素
for row in a2:
    print(a2) # 迭代a2的行

for col in a2.T:
    print(col) # 迭代a2的列

a2.flatten() # 将a2矩阵变为一维矩阵

# a2.flat相当于flattten的迭代器
for item in a2.flat:
    print(item) # 迭代a2矩阵元素
"""
"""

# numpy array的合并
import numpy as np
a = np.array([1,1,1])
b = np.array([2,2,2])
np.vstack((a,b)) # 将a与b合并(上下),即新矩阵第一行为a,第二行为b
np.hstack((a,b)) # 将a与b合并(左右),即新矩阵第一行为a与b
# 对于一维矩阵而言,不能通过a.T来将其转换为竖着的即nx1为矩阵
# np.newaxis添加一个维度
c = a[:,np.newaxis] # 在列上添加一个维度,即变为竖向矩阵

d = np.concatenate((a,b,b,a),axis=0) # 将多个矩阵进行上下合并,axis=1就是横向合并
"""
"""

# numpy array的分割
import numpy as np
a = np.arange(12).reshape((3,4))
np.split(a,2,axis=1) # 对列进行分割,分成两块(横向分割)(均等分割)
np.array_split(a,3,axis=1) # 对a进行不等分割,分为3块
np.vsplit(a,3) # 纵向上分成3块,即每行分出来,1x4
np.hsplit(a,2) # 横向上分成2块,即列分开,3x2
"""
"""

# numpy copy和deep copy
import numpy as np
a = np.arange(4)
b = a # 这样的话b就是a,当后续a的值发生变化时,b也会变
# 解决
b = a.copy() # 把a的值给b,但并没有将b与a关联起来
"""
"""

# pandas基本
import pandas as pd
import numpy as np
s = pd.Series([1,3,6,np.nan,44,1]) # 序列
dates = pd.date_range('20221111',periods=6) # 生成2022-11-11开始的6个数据的序列,默认步长为1
df = pd.DataFrame(np.random.random(6,4),index=dates,columns=['a','b','c','d']) # 行的索引为日期,列的索引为abcd,np为数据,如果不给行列索引,默认就是0开始的数字;dataframe里还可以用字典定义
# 其他方式构建(字典)
df = pd.DataFrame({
    "date":pd.date_range("20100102",periods=6),
    "age":np.arange(6)})


df.dtypes # 查看行数据类型
df.index # 行的名字
df.columns # 列的名字
df.values # df中的值,得到的是ndarray类型的值
df.describe() # 默认是描述数字类型的属性,目的在于观察这一系列数据的范围、大小、波动趋势等等(只运算矩阵)
df.T # 与numpy相同,转置
df.sort_index(axis=1,ascending=False) # 列按降序排序,相应的值位置变化
df.sort_values(by='E') # 按'E'列的值进行升序排序
"""
"""
# pandas选择数据

import pandas as pd
import numpy as np
dates = pd.date_range('20221111',periods=6)
df = pd.DataFrame(np.random.random(6,4),index=dates,columns=['a','b','c','d'])
df['a'] # 选择列名称为a的列数据,也可以:df.a
df[0:3] # 选择第0、1、2行数据
# loc根据标签选择
df['20130102':'20130104'] # 选择值在2013-1-2、2013-1-3的数据
df.loc['20130102'] # 选择日期为2013-1-2的数据
df.loc[:,['a','b']] # 选择所有行,列为a、b的数据
df.loc['20130102',['a','b']] # 选择20130102的行,列为a、b的数据
# iloc根据位置选择
df.iloc[3] # 第三行(从0开始第三行)
df.iloc[3,1] # 第三行第一列(从0开始)
df.iloc[3:5,1:3] # 第三行到第五列(不包括),第一列到第三列(不包括)(从0开始,左闭右开)
df.iloc[1,3,5,1:3] # 第一行 第三行 第五列,第一列到第三列(不包括)(从0开始,左闭右开)
# 注:ix标签与位置混合选择(现在已经被弃用)
df[df.A<8] # 将A列中小于8的值对于数据与其他列保留形成新dataframe
"""
"""
# pandas设置值
import pandas as pd
import numpy as np
dates = pd.date_range('20221111',periods=6)
df = pd.DataFrame(np.random.random(6,4),index=dates,columns=['a','b','c','d'])
df.iloc[2,2] = 1 # 第二行第二列的值改为1(从0开始)
df.iloc[20130101,2] = 2
df[df.a>5] = 0 # 修改整个,只要a列大于5,就都是0
df.a[df.a>5] = 0 # 只改a列
df['f'] = np.nan # 添加新列
"""
"""
# pandas处理丢失数据
import pandas as pd
import numpy as np
dates = pd.date_range('20221111',periods=6)
df = pd.DataFrame(np.random.random(6,4),index=dates,columns=['a','b','c','d'])
# 假设这两个数据丢失
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
df.dropna(axis=0,how='any') # 行里面只要有nan,便不要该行;如果是how='all',就是只有该行全部为nan才丢弃
# 将nan数据填上
df.fillna(value=0) # 填充0
df.isnull() # 查找数据是否有缺失,有缺失则为true
np.any(df.isnull()) == True # 则只返回一个true或false
"""
"""
# pandas导入导出数据
# 读取excel推荐使用reas_csv
# 保存:to_csv等
import pandas as pd
import numpy as np
data = pd.read_csv('test.csv')
data.to_csv('new.csv')
"""
"""
# pandas合并concat
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
df4 = pd.DataFrame(np.ones((3,4))*1,columns=['b','c','d','e'])
res = pd.concat([df1,df2,df3],axis=0) # 竖向合并,即最终矩阵为9x4 但是行的索引不会变
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True) # 重新排序,行的索引便会改变了
res = pd.concat([df1,df4],axis=0,ignore_index=True) # concat默认对于列不同的合并,会用nan填充,ignore_index=True:如果两个表index没有实际含义,使用该参数会重新整理一个index
res = pd.concat([df1,df4],axis=0,ignore_index=True,join='innner') # 这样合并就只会寻找相同部分了
res = pd.concat([df1,df4],axis=1,ignore_index=True,join_axes=[df1.index]) # 以df1为参考,左右合并

res = df1.append(df2,ignore_index=True) # 相当于df1与df2上下合并
res = df1.append([df2,df3],ignore_index=True) # 多个合并
s1 = pd.Series([1,2,3,4],index=['a','b','c','d'])
res = df1.append(s1,ignore_index=True) # 添加列
"""
"""
# pandas合并merge,merge 只做左右拼接
import pandas as pd
left = pd.DataFrame({
    "key": ["K0", "K1", "K2", "K3"],
    "A": ["A0", "A1", "A2", "A3"],
    "B": ["B0", "B1", "B2", "B3"],
})


right = pd.DataFrame({
    "key": ["K0", "K1", "K2", "K3"],
    "C": ["C0", "C1", "C2", "C3"],
    "D": ["D0", "D1", "D2", "D3"],
})


pd.merge(left, right, on="key") # 基于key列合并


# 对于基于两列的合并
left = pd.DataFrame({
    "key1": ["K0", "K0", "K1", "K2"],
    "key2": ["K0", "K1", "K0", "K1"],
    "A": ["A0", "A1", "A2", "A3"],
    "B": ["B0", "B1", "B2", "B3"],
})


right = pd.DataFrame({
    "key1": ["K0", "K1", "K1", "K2"],
    "key2": ["K0", "K0", "K0", "K0"],
    "C": ["C0", "C1", "C2", "C3"],
    "D": ["D0", "D1", "D2", "D3"],
})


pd.merge(left, right, on=["key1", "key2"])
#下面的前两种是 concat() 和 merge() 都具备的。后面几种是 merge() 另外的。

# outer: 集合两个 df 所有 的 key
# inner: 集合两个 df 同时拥有 的 key(默认) 
# left: 仅考虑左边 df 所有 的 key
# right: 仅考虑右边 df 所有 的 key
# cross: 对于两个 df key 的笛卡尔积
pd.merge(left, right, how="left", on=["key1", "key2"])
"""
"""
# pandas画图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# series数据画图
data = pd.Series(np.random.randn(1000),index=np.arange(1000))
data = data.cumsum() # 计算一个数组各行的累加值
data.plot()
plt.show()
# dataframe数据画图
df = pd.DataFrame(np.random.rand(5, 3), columns=["a", "b", "c"]) # np.random.rand(5, 3)5行3列随机数
df.plot.bar() # bar hist box kde area scatter hexbin pie


ax = df.plot.scatter(x='a',y='b',colorama='Blue',label='class1') #一组
df.plot.scatter(x='a',y='c',colorama='Red',label='class2',ax=ax) #两组一起画在一张图

plt.show()
"""
[参考1](https://mofanpy.com/tutorials/data-manipulation/pandas/)
[参考2](https://mofanpy.com/tutorials/data-manipulation/numpy/)
目录
相关文章
|
10天前
|
机器学习/深度学习 数据可视化 搜索推荐
Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。
【7月更文挑战第5天】Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。流程包括数据获取、预处理、探索、模型选择、评估与优化,以及结果可视化。示例展示了用户行为、话题趋势和用户画像分析。Python的丰富生态使得社交媒体洞察变得高效。通过学习和实践,可以提升社交媒体分析能力。
25 1
|
1天前
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
19 9
|
2天前
|
机器学习/深度学习 数据采集 大数据
驾驭大数据洪流:Pandas与NumPy在高效数据处理与机器学习中的核心作用
【7月更文挑战第13天】在大数据时代,Pandas与NumPy是Python数据分析的核心,用于处理复杂数据集。在一个电商销售数据案例中,首先使用Pandas的`read_csv`加载CSV数据,通过`head`和`describe`进行初步探索。接着,数据清洗涉及填充缺失值和删除异常数据。然后,利用`groupby`和`aggregate`分析销售趋势,并用Matplotlib可视化结果。在机器学习预处理阶段,借助NumPy进行数组操作,如特征缩放。Pandas的数据操作便捷性与NumPy的数值计算效率,共同助力高效的数据分析和建模。
|
3天前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
【7月更文挑战第12天】Python的Pandas和NumPy库助力高效数据处理。Pandas用于数据清洗,如填充缺失值和转换类型;NumPy则擅长数组运算,如元素级加法和矩阵乘法。结合两者,可做复杂数据分析和特征工程,如产品平均销售额计算及销售额标准化。Pandas的时间序列功能,如移动平均计算,进一步增强分析能力。掌握这两者高级技巧,能提升数据分析质量和效率。
16 4
|
1天前
|
机器学习/深度学习 数据采集 数据处理
重构数据处理流程:Pandas与NumPy高级特性在机器学习前的优化
【7月更文挑战第14天】在数据科学中,Pandas和NumPy是数据处理的关键,用于清洗、转换和计算。用`pip install pandas numpy`安装后,Pandas的`read_csv`读取数据,`fillna`处理缺失值,`drop`删除列。Pandas的`apply`、`groupby`和`merge`执行复杂转换。NumPy加速数值计算,如`square`进行向量化操作,`dot`做矩阵乘法。结合两者优化数据预处理,提升模型训练效率和效果。
|
2天前
|
数据采集 数据挖掘 数据处理
探索数据科学前沿:Pandas与NumPy库的高级特性与应用实例
【7月更文挑战第13天】Pandas与NumPy是Python数据分析的基石。Pandas的DataFrame和Series提供高效数据处理,如缺失值填充(fillna(), dropna())、重复值去除(drop_duplicates())和数据合并(pd.merge(), pd.concat())。数据聚合与透视分析(groupby(), pivot_table())简化复杂任务。NumPy则擅长多维数组运算,支持矩阵乘法(np.dot())、行列式计算(np.linalg.det()),并利用广播机制进行灵活的数组运算。掌握这些高级特性能增强数据科学家的分析效能。
12 2
|
10天前
|
数据采集 机器学习/深度学习 数据可视化
了解数据科学面试中的Python数据分析重点,包括Pandas(DataFrame)、NumPy(ndarray)和Matplotlib(图表绘制)。
【7月更文挑战第5天】了解数据科学面试中的Python数据分析重点,包括Pandas(DataFrame)、NumPy(ndarray)和Matplotlib(图表绘制)。数据预处理涉及缺失值(dropna(), fillna())和异常值处理。使用describe()进行统计分析,通过Matplotlib和Seaborn绘图。回归和分类分析用到Scikit-learn,如LinearRegression和RandomForestClassifier。
26 3
|
1天前
|
数据采集 机器学习/深度学习 数据处理
从基础到卓越:Pandas与NumPy在复杂数据处理中的实战策略
【7月更文挑战第14天】Pandas与NumPy在数据科学中的核心应用:**加载数据(如`read_csv`)、探索(`head()`, `info()`, `describe()`)、数据清洗(`fillna`, `dropna`, `replace`, `apply`)、数值计算(借助NumPy的`ndarray`)、分组聚合(`groupby`与聚合函数)、窗口函数(如`rolling`)和数据筛选排序(布尔索引,`query`,`sort_values`)。通过这些工具,实现从数据预处理到复杂分析的高效处理。
6 0
|
1天前
|
数据采集 数据挖掘 数据处理
Python数据分析加速器:深度挖掘Pandas与NumPy的高级功能
【7月更文挑战第14天】Python的Pandas和NumPy库是数据分析的核心工具。Pandas以其高效的数据处理能力,如分组操作和自定义函数应用,简化了数据清洗和转换。NumPy则以其多维数组和广播机制实现快速数值计算。两者协同工作,如在DataFrame与NumPy数组间转换进行预处理,提升了数据分析的效率和精度。掌握这两者的高级功能是提升数据科学技能的关键。**
7 0
|
1天前
|
数据采集 机器学习/深度学习 数据处理
数据科学家的秘密武器:Pandas与NumPy高级应用实战指南
【7月更文挑战第14天】Pandas与NumPy在数据科学中扮演关键角色。Pandas的DataFrame和Series提供高效数据处理,如数据清洗、转换,而NumPy则以ndarray为基础进行数值计算和矩阵操作。两者结合,从数据预处理到数值分析,形成强大工具组合。示例展示了填充缺失值、类型转换、矩阵乘法、标准化等操作,体现其在实际项目中的协同效用。掌握这两者,能提升数据科学家的效能和分析深度。**
12 0