Pandas库常用基础操作

2023年2月14日12:55:11

Pandas

专门用作数据处理和数据分析,底层依赖Numpy

Pandas常用数据结构

# 1.Series
# 由一组数据以及一组与之对应的数据标签(即索引)组成
import pandas as pd
import numpy as np
pd.__version__	#查看pandas版本
#创建一个Series对象
series1=pd.Series([2.8,3.01,8.99,8.59,5.18])	#行索引默认为0,1,2...
series2=pd.Series([2,3,8,9,7],index=['a','b','c','d','e'],name='This is a series')
series3=pd.Series(np.array([2.8,3.01,8.99,8.59,5.18]),index=['a','b','c','d','e'])
series4=pd.Series({"北京":2.8,"上海":3.01,"广东":8.99,"江苏":8.59,"浙江":5.18}) #字典的键即为行索引,值即为值
#常用属性
series4.values		#以数组形式展示值,结果为array([2.8 , 3.01, 8.99, 8.59, 5.18])
series4.index		#输出行索引名称,结果为Index(['北京', '上海', '广东', '江苏', '浙江'], dtype='object')
series4.index.values#结果为array(['北京', '上海', '广东', '江苏', '浙江'], dtype=object)
series4.dtype		#数据类型,结果为dtype('float64')
series4.ndim		#返回数据的维度,结果为1
series4[0:3]		#左闭右开
series4["北京":"广东"]	#此处不再左闭右开,直接取出北京标签到广东标签的索引和值
series5=pd.Series({"四川":3.80,"重庆":2.01})
series6=series4.append(series5)	#拼接数据
series4["北京"]=2.89 #修改数据,series内容改变
series6.drop("上海") #删除数据,只对视图进行操作,series内容不变
series6.drop(["四川","广东"],inplace=True)	#删除数据,直接对series进行操作,series内容改变

# 2.DataFrame
# 类似于数据库中的表结构,既有行索引也有列索引
import pandas as pd
import numpy as np
#创建一个DataFrame对象
list1=[["张三",23,"男"],["李四",24,"女"],['王五',26,"女"]]
array1=np.array(list1)
df1=pd.DataFrame(list1,columns=["姓名","年龄","性别"])	#指定列名,行索引默认为0,1,2...
df2=pd.DataFrame({"姓名":["张三","李四","王五"],"年龄":[23,24,26],"性别":["男","女","女"]}) 
df3=pd.DataFrame(array1,columns=["姓名","年龄","性别"],index=['a','b','c'])
#常用属性
df3.values		#以数组形式输出数据
df3.shape		#告诉数据集有几行几列,结果为(3, 3)
df3.dtypes		#输出每一列的数据类型
df3.columns		#输出数据集的列名,结果为Index(['姓名', '年龄', '性别'], dtype='object')
df3.index		#输出数据集的行名,结果为Index(['a', 'b', 'c'], dtype='object')
df3.columns.tolist()	#结果为['姓名', '年龄', '性别']
df3.index.tolist()		#结果为['a', 'b', 'c']
df3.ndim		#输出数据集维度,结果为2
df3.size		#总共有几个元素,结果为9

数据获取和保存

import os
import pandas as pd
os.getcwd()		#获取当前路径
os.chdir('/Users/songdi/Desktop/code/python')	#修改路径
df=pd.read_csv(r'test1.csv',encoding='gbk')		#读取csv文件中的数据
df.head(3)		#查看前三行
df.tail(3)		#查看后三行
df.dtypes		#查看每列数据类型
pd.read_csv?	#查看pd.read_csv使用方法
#读取csv文件中的数据时,参数:dtype指定某列数据类型,nrows指定只读取前几行,sep指定分隔符(默认为逗号),na_values指定值为几时代表缺失值NaN,header指定第几行为表头
df=pd.read_csv(r'test1.csv',encoding='gbk',dtype={'id':str,'emp':str},nrows=2,sep=',', na_values=70,header=0) 
#读取excel文件中的数据时,参数:sheet_name指定要读取的工作表名,dtype指定某列数据类型
df=pd.read_excel('test2.xlsx',encoding='utf-8',sheet_name='Sheet1',dtype={'id':str})
#读取excel中多个工作表(用循环)
data_all=pd.DataFrame()
sheet_name=['Sheet'+str(i) for i in range(1,4)]
for i in sheet_name:
    data=pd.read_excel('test2.xlsx',encoding='gbk',sheet_name=i)
    data_all=pd.concat([data_all,data],axis=0,ignore_index=True)
#数据保存
df.to_csv('df.csv',index=False,encoding='gbk')	#将数据保存为csv文件,不写入索引
df.to_excel('df.xlsx',index=False,encoding='gbk')	#将数据保存为excel文件,不写入索引

数据筛选

import pandas as pd
import numpy as np
import os
os.chdir('/Users/songdi/Desktop/code/python')
os.getcwd()
order=pd.read_excel('test2.xlsx',encoding='utf-8',sheet_name='Sheet1',dtype={'id':str})
order.head(5)
order.tail(5)
order.columns			#查看列名
order.dtypes			#查看列数据类型
order.ndim				#查看数据维数
order.size				#查看有多少元素(行数*列数)
order[:3]				#左闭右开,查看前三行
order.dishes_name		#选择某一列(一列其实就是一个Series)
order['dishes_name']	#选择某一列
order[['dishes_name','logicprn_name']]	#选择多列
order['dishes_name'][:3]#选择某列的前三行
#loc和iloc
order.loc[:,'id']		#选择所有行,id列 
order.loc[:,['id','name']]	#选择所有行,多列
order.loc[0:2,'id']		#选择行标签为0-2的行,id列
order.loc[2,'id']		#选择行标签为2的行,id列
order.loc[order['id']==444,['id','dishes_name']]#选择id为444的所有行,id和dishes_name列
order.iloc[:,1:3]		#选择所有行,第二列第三列
order.iloc[:,[1,2]]		#选择所有行,第二列第三列
order.iloc[2,[1,2]]		#选择第二行,第二列第三列
order.iloc[2:4,[1,2]]	#选择第三行第四行,第二列第三列
order.loc[0:3]			#不是左闭右开,从行标签为0的取到行标签为3的行
order.iloc[0:3]			#左闭右开,从行标签为0的取到行标签为2的行

条件查询和增删改查

#条件查询
order[order['id']==444][['id','name']]		#条件查询,前面是条件,后面要查询出来的列
order[~(order['id']==444)][['id','name']]	#条件查询,非
order[(order['id']==444)&(order['count']>3)][['id','name']]	#多重条件查询,且
order[(order['id']==444)|(order['count']>3)][['id','name']]	#多重条件查询,或
order[order['count'].between(100,500,inclusive=True)][['id','name']]	
order[order['count'].isin([100,200,300,400,500])][['id','name']]
order[order['name'].str.contains('烤')][['id','name']]
#增删改查
order['payment']=order['count']*order['price']		    #增加列
order['payway']='现金支付'								 #增加列
order.drop('payway',axis=1)								#删除列,只作用于视图,不作用于原数据
order.drop('payway',axis=1,inplace=True)				#删除列,作用于原数据
del order['payment']									#删除列,作用于原数据
order.drop(['payway','payment'],axis=1,inplace=True)	#删除多列,作用于原数据
mid=order['id']
order.drop(['id'],axis=1,inplace=True)
order.insert(0,'id',mid)		#插入一列,参数为:插入位置,列名,元素
order.drop(labels=[1,2],axis=0)							#删除行,只作用于视图,不作用于原数据
order.drop(labels=[1,2],axis=0,inplace=True)            #删除行,作用于原数据
order.loc[order['id']==444,'id']=44400					#把id为444的所有行的id修改为44400
order.rename(columns={'price':'价格'},inplace=True)	   #修改列名
order.rename(index={0:'0900'},inplace=True)				#修改行索引名称
order.describe().loc['count']==0						#为False则说明该行数据没有缺失

数据库数据读取和保存

import pymysql
from sqlalchemy import  create_engine
import pandas as pd
# 1.从数据库中读取数据
conn=create_engine('mysql+pymysql://root:root@localhost:3306/test1')	#建立连接
sql='select * from books'
df1=pd.read_sql(sql,conn)
df1.head(5)
#封装为一个函数
def query(table):
    host='localhost'
    user='root'
    password='root'
    database='test1'
    port=3306
    conn=create_engine('mysql+pymysql://{}:{}@{}:{}/{}'.format( user, password, host, port, database))
    sql='select * from '+str(table)
    results=pd.read_sql(sql,conn)
    return results
#调用函数
df2=query('books')
# 2.保存数据到数据库
import os
os.chdir('/Users/songdi/Desktop/code/python')
df=pd.read_csv('test1.csv')
conn=create_engine('mysql+pymysql://root:root@localhost:3306/test1')
try:
    #表名,连接,不存入索引,如果该表名存在则替换该表
    df.to_sql('testdf',con=conn,index=False,if_exist='replace')	
except:
    print('error')

数据整合(数据合并)

将不同的信息汇集到一张表上

# 1.堆叠
#横向堆叠
df1=pd.DataFrame({'id':[1,2,3,4,5],'name':['张三','李四','王五','丁一','赵六'],'age':[27,24,25,23,25],'gender':['男','男','女','女','男']})
df2=pd.DataFrame({'Id':[1,2,2,5,6,7],'kemu':['科目1','科目1','科目2','科目1','科目2','科目3'],'score':[83,81,87,75,86,88]})
df3=pd.DataFrame({'id':[1,3,5],'name':['张三','王二','赵五'],'income':[13500, 18000, 15000]})
merged=pd.concat([df1,df2],axis=1,join='inner')		#按照索引取交集横向合并
merged=pd.concat([df1,df2],axis=1,join='outer') 	#按照索引取并集横向合并
#纵向堆叠(列名需一样)
order1=pd.DataFrame({'id':[1,2,3],'name':['科目1','科目1','科目2'],'score':[83,81,87]})
order2=pd.DataFrame({'id':[1,3,5],'name':['张三','王二','赵五'],'score':[13500, 18000, 15000]})
data=pd.concat([order1,order2],axis=0,ignore_index=True)	#纵向合并,忽略原来索引重新编号
data.reset_index(drop=True)		#将原来索引扔掉重置索引,只改变视图,不改变原数据
data.reset_index(drop=True,inplace=True)	#将原来索引扔掉重置索引,改变原数据

# 2.按主键合并
merge1=pd.merge(left=df1,right=df2,how='right',left_on='id',right_on='Id')	#右连接,左边匹配不上的即为空值NaN
merge1=pd.merge(left=df1,right=df2,how='left',left_on='id',right_on='Id')	#左连接,右边匹配不上的即为空值NaN
merge1=pd.merge(left=df1,right=df2,how='outer',left_on='id',right_on='Id')	#全连接,两张表的数据都输出出来,匹配不上的即为空值NaN
merge1=pd.merge(left=df1,right=df2,how='inner',left_on='id',right_on='Id')	#内连接。只输出两张表中能匹配的上的情况
df=pd.read_csv('quanr_free_trip.csv')
df1=pd.read_csv('quanr_route_trip.csv')
#多主键情况,sort指明是否根据连接键进行排序
data=pd.merge(df,df1,left_on=['出发地','目的地'],right_on=['出发地','目的地'],sort=True) 
# 3.按索引合并
merge1=pd.merge(left=df1,right=df2,how='inner',left_index=True,right_index=True)

层次化索引

import pandas as pd
import os
os.chdir('/Users/songdi/Desktop/code/python')
#index_col指定索引,用第

  • 作者:番大茄子
  • 原文链接:https://blog.csdn.net/SongD1114/article/details/123944353
    更新时间:2023年2月14日12:55:11 ,共 6961 字。