Pandas数据分析处理

Pandas数据结构

序列

对象结果如下图所示

indexvalues
011
122
233
344
455
序列的特点:1)元素都是数据,2)尺寸大小不可变,3)数据的值可以改变
# pandas.Series(data=None,index=None,dtype=None,name=None,copy=False,fastpath=False)
import pandas as pd
data=pd.Series(data=[85,74,98,64,82])
print("初始序列为: \n",data)
data.index=[1,2,3,4,5]
print("更改索引后的序列为: \n",data)
print("序列的大小为:%d,维度为:%d,最大值为:%d,最小值为,%d"%(data.size,data.ndim,data.max(),data.min()))
info={"id":"1001","name":"张三"}
data=pd.Series(data=info)
print("由字典创建的序列为: \n",data)
print("data[1]=",data.iloc[1])
print("字符串连接edu:\n",data+"edu")
属性说明
loc使用索引值取子集
iloc使用索引位置取子集
dtype或dtypes序列内容的类型
T序列的转置矩阵
shape数据的维数
size序列中元素的数量
values序列的值
方法说明
append()连接两个或多个序列
cov()计算与另一个序列的协方差
equals()判断两个序列是否相等
get_equals()获得序列的值
hist()绘制直方图
min()返回最小值
max()返回最大值
mean()返回平均值
sort_values()对值进行排序

数据帧

index高数英语物理columns
0969592rows
1949792
2979790
3939491
数据帧的特点:1)列之间可以是不同的数据类型,2)大小可以改变,数据也可以改变,3)有行标签轴,也有列标签轴。4)可以对行和列执行算术运算。
#pandas.DataFrame(data=None,index=None,columns=None,dtype=None,copy=False)
import pandas as pd
import numpy as np
data=pd.DataFrame(np.random.randint(80,92,size=(3,4)))
print(data)
data=pd.DataFrame(np.random.permutation(np.arange(76,100,2).reshape(3,4)),index=["1","2","3"],columns=["高数","英语","物理","数电"])
print("带行和列索引的DataFrame:\n",data)
data["Python"]=[84,78,92]
print("添加列之后的DataFrame:\n",data)
del data["Python"]
print("删除列之后的DataFrame:\n",data)
属性说明
indexDataFrame中的行索引
columnsDataFrame中的列索引
ndim数据集的维数
dtypes返回每一列元素的数据类型
shape获取行和列
size数据的个数
valuesDataFrame中的数值
方法说明
min()返回最小值
max()返回最大值
mean()返回平均值
std()标准差
count()统计非空数量
describe()打印描述信息

索引

重建索引(和更改索引有差别)

#pd.DataFrame.reindex(labels=None,columns=None,axis=None,method=None,copy=True,level=None,fill_values=nan,limit=None,toleance=None)
#method():填充的方式。可选值包括(backfill向前填充、bfill向后填充、pad用前面的非缺失数据填充、ffill用后面的非缺失数据填充)
import pandas as pd
import numpy as np
data=pd.DataFrame(np.random.randint(80,92,size=(3,4)))
print(data)
data1=data.reindex(index=["1","2","3"],columns=["1","2","3","4"])
print("修改后:\n",data1)

重命名索引

#rename(mapper=None,index=None,columns=None,axis=None,copy=True,inplace=False,level=None)
#inplace:是否原地重命名,即是否创建副本修改数据
import pandas as pd
import numpy as np
data=pd.DataFrame(np.random.permutation(np.arange(76,100,2).reshape(3,4)),index=["1","2","3"],columns=["高数","英语","物理","数电"])
data1=data.rename(index={"1":"haha","3":"xixi"})
print(data1)

层次化索引

import pandas as pd
import numpy as np
data=np.random.randint(70,90,size=12).reshape(3,4)
index=[["a","b","c"],["1","2","3"]]
column=["高数","英语","物理","C语言"]
df=pd.DataFrame(data,index=index,columns=column)
print(df.index[1][1])

数据运算

算术运算

import pandas as pd

s1 = pd.Series([1, 2, 3, 4], index=['a', 'c', 'b', 'd'])
s2 = pd.Series([5, 6, 7, 8], index=['a', 'd', 'c', 'b'])
result_series = s1 + s2
print("Result of adding two Series:\n",result_series)
df1 = pd.DataFrame({
    'A': [1, 2, 3, 4],
    'B': [5, 6, 7, 8]
}, index=['a', 'd', 'c', 'b'])
df2 = pd.DataFrame({
    'A': [9, 10, 11, 12],
    'B': [13, 14, 15, 16]
}, index=['a', 'd', 'c', 'b'])
result_dataframe = df1 + df2
print("\nResult of adding two DataFrames:\n",result_dataframe)

汇总和统计

import pandas as pd
import numpy as np

data = {
    'A': [1, 2, 3, 3, 5],
    'B': [50, 4, 3, 2, 1],
    'C': [20, 20, 30, 40, 50],
    'D': [200, 200, 300, 400, 500]
}
df = pd.DataFrame(data)
print("DataFrame:\n",df)
# 计算各种统计量
max_values = df.max(axis=1)
min_values = df.min(axis=0)
mean_values = df.mean()
median_values = df.median()
mode_values = df.mode().iloc[0]  # 求众数,可能有多个值,取第一个
std_deviation = df.std()
percentiles = df.quantile([0.25, 0.5, 0.75])  # 计算25%, 50% (中位数), 75% 分位数
print("Max values:\n",max_values)
print("Min values:\n",min_values)
print("Mean values:\n",mean_values)
print("Median values:\n",median_values)
print("Mode values:\n",mode_values)
print("Standard Deviation:\n",std_deviation)
print("Percentiles:\n",percentiles)

唯一值和值计数

#unique()函数进行去重
#values_counts()函数统计每个值出现的次数
#上面两个函数是Series拥有的方法,在DataFrame中使用是选哟指定哪一列或者哪一行。

数据排序

按索引排序

#sort_index(axis=0,level=None,ascending=True,inplace='False',kind='quicksort',na_position='last',sort_remaining=True)
#axis:排序的方向,值为0按行名进行排序,值为1按列名进行排序。
#level:默认None,否则按名进行排序,值为1按名列进行排序。
#ascending:是否升序排列,默认True,表示升序,False表示降序。
#inplace:默认False,表示对数据进行排序,创建新的实例。
#kind:选择排序的算法,默认是quicksort。
#na_position:缺失值存放的位置,默认为last,表示缺失值排在最后,如果设为first,表示缺失值排在开头。
import pandas as pd
s=pd.Series([91,64,78,75,78],index=[5,3,1,6,5])
print("原序列:\n",s)
print("按索引升序排序:\n",s.sort_index())
print("按索引降序排序:\n",s.sort_index(ascending=False))
data=pd.DataFrame([[71,91,77,88],[89,95,65,75],[77,68,78,93]], index=["2","1","3"], columns=[5,2,2,7])
print("原数据帧:\n",data)
print("按行索引名升序排序:\n",data.sort_index())
print("按列索引名降序排序:\n",data.sort_index(ascending=False,axis=1))

按值排序

#sort_values(by,axis=0, level=None, ascending=True,inplace=False,kind='quicksort', na_position='last')
#该函数的参数与sort_index()函数的参数大多相同,其中,by是表示排序的列。
import pandas as pd
s=pd.Series([91,64,78,75,78],index=[5,3,1,6,5])# 创建具有缺失值的序列
print("原序列:\n",s)
print("按值降序排序:\n",s.sort_values (ascending=False))
data=pd.DataFrame([[71,91,77,88],[71,95,65,75],[87,68,87,93]],
index=['1','2','3'],columns=['高数 ','英语 ','物理 ','C语言 '])
print("原数据帧:\n",data)
# 对索引为"1"的数据进行升序排序
print("按值升序排序:\n",data.sort_values(by="1",axis=1))
# 对列索引“高数”为主索引,“英语”为次索引进行降序排序
print("按列值降序排序:\n",data.sort_values(by=['高数 ','英语 '],ascending=False))

缺失项处理

Pandas中,缺失值的类型包括:
1)NaN:表示Not a Number,通常用于浮点型数据类型。
2)None:表示Python中的空值,通常用于对象和字符串类型。
3)NaT:表示Not a Time,通常用于时间序列数据类型。

判断缺失值

#isnull()函数
#notnull()函数

import pandas as pd
import numpy as np
s=pd.Series(["a","b",np.nan,"c",None])
# 创建含有缺失值的序列
print("创建的序列s:\n",s)
print("s 的缺失值:\n",s.isnull())
#判断 s 的缺失值
print("s中存在的缺失值和索引\n",s[s.isnull()])
#判断 s 中存在缺失值的列
data=pd.DataFrame([["a","b",np.nan,"c",5],[3,None,5,5,None], [1,2,3,4,5]])
print("创建的数据帧data:\n",data)
print("data 的缺失值:\n",data.isnull())
#判断 data 的缺失值
print("data中存在缺失值的列:\n",data.isnull().any())
#判断 data 中第3列的缺失值
print("data中第3列的缺失值:\n",data[2].isnull())

删除缺失值

#dropna(self,axis=0,how='any',thresh=None,subset=None,inplace=False)
#thresh:非空元素最低数量。
import pandas as pd
import numpy as np
s=pd.Series(["a","b",np.nan,"c",None])
# 创建含有缺失值的序列
print("创建的序列s:\n",s)
print("删除s中的缺失值:\n",s.dropna())
data=pd.DataFrame([["a","b",np.nan,"c",5],[3,None,5,5,None], [1,2,3,4,5]])
print("创建的数据帧data:\n",data)
print("删除data中存在缺失值的行:\n",data.dropna())
print("删除data中存在缺失值的列:\n",data.dropna(axis=1))

填充缺失值

#DataFrame.fillna(values=None,method=None,axis=None,inplace=False,limit=None)
#method():填充的方式。可选值包括(backfill向前填充、bfill向后填充、pad用前面的非缺失数据填充、ffill用后面的非缺失数据填充)
#limit:限制填充缺失值的最大数量
import pandas as pd
import numpy as np
s=pd.Series(["a","b",np.nan,"c",None])
# 创建含有缺失值的序列
print("创建的序列s:\n",s)
print("填充s中的缺失值:\n",s.fillna(0))
data=pd.DataFrame([["a","b",np.nan,"c",5],[3,None,5,5,None], [1,2,3,4,5]])
print("创建的数据帧data:\n",data)
print("向前填充data中存在缺失值:\n",data.ffill())#新版改版
print("向后填充data中存在缺失值:\n",data.bfill())#新版改版

数据的读写

读取CSV文件

图片中的文字是关于Pandas库中读写CSV文件的说明。以下是这些内容的摘录:

8.6.1 读写CSV文件

CSV(Comma Separated Values,逗号分隔值)文件以纯文本形式存储表格数据(数字和文本),可以使用任何编辑器进行编辑,支持追加模式写入,节省内存开销。

  1. 读取CSV文件
    Pandas提供了read_csv()函数来读取CSV文件,该函数从文件中加载带分隔符的数据,其一般形式为:

    pandas.read_csv(filepath_or_buffer, sep=',', header='infer', names=None, index_col=None, usecols=None, engine=None, skiprows=None, skipfooter=0, ...)
    

    常用参数说明如下:

    • filepath_or_buffer: 表示文件路径或缓冲区,也可以是一个URL,如http/ftp文件。
    • sep: 指定分隔符,如果指定,默认’,'分隔。
    • header: 指定行用来作为列名,如果读取的文件没有列名,则默认为0,否则设置为None。
    • names: 用于结果的列名列表,如果数据文件中没有列标题行,则需要执行header=None。
    • index_col: 作行索引的列编号或列名,如果给定一个序列,则表示有多个行索引。
  2. 写入CSV文件
    Pandas提供了to_csv()函数用来把DataFrame数据写人CSV文件中,其一般形式为:

    DataFrame.to_csv(path_or_buf=None, sep=',', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, ...)
    

    常用参数说明如下:

    • path_or_buf: 文件路径或对象。
    • sep: 分隔符,默认为“,”。
    • na_rep: 缺失值字符串,默认为空。
    • header: 写出列名。如果给出字符串列表,则假定为列名的别名。
    • index: 写出行名称(索引)。

import pandas as pd
data = pd.DataFrame([[71,91,77,88],[89,95,65,75],[87,68,82,93]], index=["1","2","3"],columns=["高数","英语","物理","C语言"])
# 写入csv文件,以“*”作为分隔符,不保存行索引
data.to_csv("C:/Users/21031/Desktop/stu.csv",sep="*",columns=["高数","英语","物理","C语言"],index=False)
# 以“*”为分隔符读出 csv 文件的数据,第一行为列名
data=pd.read_csv("C:/Users/21031/Desktop/stu.csv",sep="*",header=0)
print("从文件中读取的数据为:\n",data) #读取两列数据
data=pd.read_csv("C:/Users/21031/Desktop/stu.csv",sep="*",header=0,usecols=['英语','物理'])
print("从文件中读取英语和物理两列数据为:\n",data) # 不读取第一行数据
data=pd.read_csv("C:/Users/21031/Desktop/stu.csv",sep="*",header=0,skiprows=[0])
print("不读取文件第一行的数据为:\n",data)

读写Excel文件

Excel文件是Microsoft Office的组件之一,使用Excel文件可以进行各种数据处理和统计分析。因而在金融、统计、管理等领域被广泛应用。Excel文件的扩展名为.xls和.xlsx两种。在执行pandas读取Excel文件的操作时,需提前安装xlrd库和openpyxl库。

  1. 读取Excel文件
    Pandas提供了read_excel()函数来读取Excel文件,其一般形式为:

    pandas.read_excel(io, sheetname=0, header=0, index_col=None, names=None, usecols=None, squeeze=False, dtype=None, skiprows=None, skip_footer=0)
    

    常用参数说明如下:

    • io: 文件路径。
    • sheetname: 指定要读取的工作表,可接收整型或字符串,整型指工作表的索引,字符串指工作表的名字。
    • header: 指定为列为名的行,默认为0,即第一行的值为列名。
    • index_col: 用作行索引的列编号或列名,如果给定一个序列,则表示有多少个行索引。
    • names: 默认为None,要使用的列名列表,如果不包含标题行,则设置header=None。
  2. 写入Excel文件
    Pandas提供了to_excel()函数将DataFrame数据写入Excel文件,其一般形式为:

    DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, sheet_name=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True,freeze_panes=None,storage_options=None)
    

    常用参数说明如下:

    • excel_writer: 文件路径。
    • sheet_name: 写入Excel文件的工作表名,默认为’Sheet1’。
    • na_rep: 表示缺失数据。
    • columns: 选择输出的列。
    • header: 写出列名。
    • index: 写出行名称(索引)。

读写数据库文件

在实际应用中,所使用的数据通常使用数据库文件进行存储,Pandas支持SQLServer、MySQL、Oracle、SQLite、MangoDB等主流数据库的读写操作。
pandas.io.sql模块提供了独立于数据库的名为sqlalchemy的统一接口,不管是什么类型的数据库,pandas都以sqlalchemy方式建立连接,它简化了连接模式,统一使用create_engine()函数连接各种数据库。一般形式为:

from sqlalchemy import create_engine
create_engine ( " 数据库类型 + 数据库驱动 // 用户名 : 密码 @IP 地址 : 端口 / 数据库 ", 其他参数)

Pandas 的io.sql模块中提供了常用的读写数据库函数

函数说明
read_sql_table()读取的完整的数据表中的数据转换成DataFrame对象
read_sql_query()将SQL语句读取的结果转换成DataFrame对象
read_sql()上述两个函数的结合,既可以读数据表,也可以读 SQL 语句
to_sql()将数据写入到 SQL 数据库中

1.读写数据库文件

pandas.read_sql(sql,con,index_col=None,coerce_float=True,columns=None,...)
  • sql:SQL语句。
  • con:表示数据库连接信息,包括数据库的用户名、密码等。
  • index_col:索引列。
  • coerce_float:将数据库中的decimal类型的数据转换为pandas中的float64类型的数据。
  • columns:list类型,表示需要读取数据的列名。

2. 写入数据库文件

DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None, method=None)

常用参数说明如下:

  • name:数据库表的名称。
  • con:数据库的连接信息。
  • if_exists:如果表已经存在,如何进行操作,值可以为 failreplaceappend,默认为 fail。每个取值代表含义如下:
    • fail:如果表存在,则不执行写入操作。
    • replace:如果表存在,则将原数据表删除再重新创建。
    • append:如果表存在,则在原数据表的基础上追加数据。
  • index:表示是否将DataFrame行索引作为数据传入数据库,默认为True。
  • index_label:表示是否引用索引名称。如果index设为True,此参数为None,则使用默认名称;如果index为层次化索引,则必须使用序列类型。
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值