pandas practice

本文介绍了Pandas中的数据结构Series和DataFrame,包括如何创建、查看和操作这些数据结构。从数据查看、数据输入输出到数据清洗、数据转换等基本操作,详细阐述了Pandas在数据分析中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 数据结构

## Series--
用列表生成Series时,Pandas默认自动生成整数索引,也可以指定索引。是有索引的一维数组,numpy没有索引
import pandas as pd
import numpy as np
l = [0, 1, 7, 9, np.NAN, None, 1024, 1025]
#无论是numpy中的nan还是python中的None在pandas中都以缺失数据NaN对待
s1 = pd.Series(data = l)#Pandas自动添加索引
s2 = pd.Series(data =l,index = list('abcdefhi'),dtype = 'float32' )#指定行索引
#传入字典创建,key行索引
s3 = pd.Series(data = {'a':99,'b':137,'c':149})
display(s1,s2,s3)
## DataFrame 

这是由多种类型的列构成的二维标签数据结构,类似于excel\sql\Series对象构成的字典。
import pandas as pd
import numpy as np
#index 作为行索引,字典中国的key作为列索引,创建3*3的DataFrame表格二维数组
df1 =  pd.DataFrame(data = {'python':[99,107,122],'Math':[111,137,88],'En':[68,108,43]},
                   index = ['张三','李四','Michel'])#key是列索引,index是行索引
df2 = pd.DataFrame(data = np.random.randint(0, 151, size=(5, 3)),
                  index = ['Danial','Brandon','softpo','Ella','Cindy'],
                  columns = ['python','Math','En'])
display(df1,df2)
### 数据查看
查看DataFrame的常用属性和DataFrame的概览和统计信息

import pandas as pd
import numpy as np
#创建shape(150,3)的二维标签数组结构DataFrame
df = pd.DataFrame(data = np.random.randint(0,151,size = (150,3)),
                 index = None,
                 columns=['python','Math','En'])
#查看其属性、概览和统计信息
df.head(10)#显示头部10行,默认5个
df.tail(10)#显示末尾10行默认5个
df.shape
df.dtypes#查看数据类型
df.index#获取行索引
df.columns#获取列索引
df.values#获取对象值,二维ndarray数组
df.describe()#查看数值类型列的汇总统计
df.info()#查看列索引、数据类型、非空计数和内存信息
# 数据输入与输出

## 第一节csv
import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,50,size = (50,5)),#薪资情况
                  columns=['IT','化工','生物','教师','士兵'])
#保存到当前路劲下,文件名是:salary.csv.csv逗号分割值文件格式
df.to_csv('./salary.csv',sep = ';',#文本分割符合,默认是逗号
         header = True,#是否保存列索引
         index = True)#是否保存航索引,保存时,文件被加载时默认行索引会作为一列
    
#加载
pd.read_csv('./salary.csv',sep = ';',header=[0],index_col=0)#可以指定第几列作为行索引
#pd.read_table('./salary.csv',sep = ';',header=0,index_col=1)#it作为行索引
## 第二节 excel

import pandas as pd
import numpy as np
df1 = pd.DataFrame(data = np.random.randint(0,50,size = (50,5)),#薪资情况
                  columns=['IT','化工','生物','教师','士兵'])
df2 = pd.DataFrame(data = np.random.randint(0,50, size = (150,3)),
                    columns = ['python','Tensorflow','Keras'])#计算机科目考试成绩
#保存到当前9路劲,salary.xls
df1.to_excel('./salary.xls',sheet_name='salary',
            header=True,
            index = False)

pd.read_excel('./salary.xls',
              sheet_name=0,
              header=0,#使用第一行作为列索引
              names=list('ABCDE'),#替换列索引
              index_col = 1)#指定行索引))

#一个excel保存多个sheet

df1 = pd.DataFrame(data = np.random.randint(0,50,size = (50,5)),#薪资情况
                  columns=['IT','化工','生物','教师','士兵'])
df2 = pd.DataFrame(data = np.random.randint(0,50, size = (150,3)),
                    columns = ['python','Tensorflow','Keras'])#计算机科目考试成绩
#一个Excel文件保存多个工作表
with pd.ExcelWriter('./data.xlsx') as writer:
    df1.to_excel(writer,sheet_name='salary',index=False)
    df2.to_excel(writer,sheet_name='score',index=False)
pd.read_excel('./data.xlsx',sheet_name=0)
### sql ---这个可以参考下,需要用到的时候

import pandas as pd
# SQLAlchemy是Python编程语⾔下的⼀款开源软件。提供了SQL⼯具包及对象关系映射(ORM)⼯具
from sqlalchemy import create_engine
df = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),# 计算机科⽬的考试
成绩
columns=['Python','Tensorflow','Keras'])
# 数据库连接
conn = create_engine('mysql+pymysql://root:12345678@localhost/pandas?
charset=UTF8MB4')
# 保存到数据库
df.to_sql('score',#数据库中表名
conn,# 数据库连接
if_exists='append')#如果表名存在,追加数据
# 从数据库中加载
pd.read_sql('select * from score limit 10', # sql查询语句
conn, # 数据库连接
index_col='Python') # 指定⾏索引名
#对于HDF5
import numpy as np
import pandas as pd
df1 = pd.DataFrame(data = np.random.randint(0,50,size = [50,5]), # 薪资情况
columns=['IT','化⼯','⽣物','教师','⼠兵'])
df2 = pd.DataFrame(data = np.random.randint(0,50,size = [150,3]),# 计算机科⽬的考
试成绩
columns=['Python','Tensorflow','Keras'])
# 保存到当前路径下,⽂件命名是:data.h5
df1.to_hdf('./data.h5',key='salary') # 保存数据的key,标记
df2.to_hdf('./data.h5',key = 'score')
pd.read_hdf('./data.h5',
key = 'salary')#获取指定的标记、key的数据
# 数据选取

## 获取数据
import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,150,size = (150,3)),
                 columns=['python','Tensorflow','Keras'])
df['python']#根据列名获取单列Series
df.python#直接用点方法
df[['python','Keras']]#多列数据要2个方括号
df[3:15]#行切片
### 标签选择
可以只有行标签,不能只有列标签
import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,150,size = (10,3)),
                  index=list('ABCDEFGHIJ'),
                 columns=['python','Tensorflow','Keras'])
df.loc[['A','B','D','F']]#选取指定行标签的数据
df.loc['A':'E',['python','Keras']]#根据行标签,选取指定列标签的数据
df.loc[:,['python','Keras']]#冒号表示所有行
df.loc['E'::2,'python':'Keras']#行切片从e开始每2个取一个,列标签切片
df.loc['A','python']#取某一个值
### 位置选择
import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,150,size = (10,3)),
                  index=list('ABCDEFGHIJ'),
                 columns=['python','Tensorflow','Keras'])
df.iloc[4]#用整数位置选择
df.iloc[2:8,0:2]#用整数切片,类似numpy
df.iloc[2:7:2,0:1]#行索引切片每个2个取一个,列索引切片
df.iloc[[1,3,5],[0,2,1]]#整数列表按照位置切片
df.iloc[1:3,:]
df.iloc[:,:2]
df.iloc[0,2]
###  第四节 boolean索引
import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,150,size = (10,3)),
                  index=list('ABCDEFGHIJ'),
                 columns=['python','Tensorflow','Keras'])
cond1 = df.python > 60#判断分数是否大于0,返回值是布尔类型的series
df[cond1]#返回满足条件的数据
cond2 = (df.python > 50 ) & (df['Keras'] > 50)#且运算
df[cond2]
df[df > 50]#返回满足条件的值。不满足返回NaN
df[df.index.isin(['A','B','C'])]#isin判断是否在数组中,返回也是布尔类型
### 第五节 赋值操作
import pandas as pd
import numpy as np
df = pd.DataFrame(data = np.random.randint(0,150,size = [10,3]),# 计算机科⽬的考试

index = list('ABCDEFGHIJ'),# ⾏标签,⽤户
columns=['Python','Tensorflow','Keras']) # 考试科⽬

s = pd.Series(data = np.random.randint(0,150,size = 9),
              index = list('BCDEFGHIJ'),name='pyTorch')
#display(df,s)
df['pyTorch']=s#增加一列,根据行索引自动对齐,没有数据就补NaN
df.loc['A','Python'] = 256
df.iloc[3,2] = 0
df.loc[:,'Python'] = np.array([128] * 10)#按照numpy数组进行赋值
df[df >= 128] = -df#按照where条件赋值,true就执行
#总结,左边为需要被赋值的数据,右边为赋值数据
#第⼆节 插⼊
#插入数据insert(数据展示在指定位置之后),指定位置,指定列名,指定值,只能按列插入,若要按行,可以选择切割、添加
#合并的方式
import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,151,size = (10,3)),
index = list('ABCDEFGHIJ'),
columns = ['Python','Keras','Tensorflow'])
df
df1=df.insert(loc = 1,column='pytorch',value=np.random.randint(0,151,size=10))
display(df,df1)

### 第三节 Join SQL⻛格合并
数据集的合并(merge)或连接(join)运算是通过⼀个或者多个键将数据链接起来的。这些运算是关
系型数据库的核⼼操作。pandas的merge函数是数据集进⾏join运算的主要切⼊点。
import pandas as pd
import numpy as np
# 表⼀中记录的是name和体重信息
df1 = pd.DataFrame(data = {'name':
['softpo','Daniel','Brandon','Ella'],'weight':[70,55,75,65]})
# 表⼆中记录的是name和身⾼信息
df2 = pd.DataFrame(data = {'name':
['softpo','Daniel','Brandon','Cindy'],'height':[172,170,170,166]})
df3 = pd.DataFrame(data = {'名字':
['softpo','Daniel','Brandon','Cindy'],'height':[172,170,170,166]})
# 根据共同的name将俩表的数据,进⾏合并
df = pd.merge(df1,df2,how='inner',on = 'name')
df4 = pd.merge(df1,df3,how = 'outer',#全外连接,两对象并集
               left_on='name',#左边DataFrame使⽤列标签 name进⾏合并
               right_on='名字')#右边DataFrame使⽤列标签 名字进⾏合并

# 创建10名学⽣的考试成绩
df4 = pd.DataFrame(data = np.random.randint(0,151,size = (10,3)),
index = list('ABCDEFHIJK'),
columns=['Python','Keras','Tensorflow'])
# 计算每位学⽣各科平均分,转换成DataFrame
score_mean = pd.DataFrame(df4.mean(axis = 1).round(1),columns=['平均分'])
#display(df4,score_mean)
hebin=pd.merge(left=df4,right=score_mean,
        left_index=True,#左边DataFrame使⽤⾏索引进⾏合并
        right_index = True)#右边的DataFrame使⽤⾏索引进⾏合并
## 第七部分 数据清洗
import numpy as np
import pandas as pd
df = pd.DataFrame(data = {'color':
['red','blue','red','green','blue',None,'red'],
'price':[10,20,10,15,20,0,np.NaN]})
# 1、重复数据过滤
df.duplicated()#判断是否存在重复数据,要全部一样才算重复
df.drop_duplicates()#删除重复数据
# 2、空数据过滤
df.isnull()#判断是否存在空数据,存在返回True,否则返回False
df.dropna(how = 'any')#删除空数据
df.fillna(value=111)# 填充空数据
#3、指定⾏或者列过滤
del df['color']#删除某一列
df.drop(labels=['price'],axis=1)#删除指定列
df.drop(labels=[0,1,5],axis=0)#删除指定行
#4、函数filter使⽤
df = pd.DataFrame(np.array(([3,7,1], [2, 8, 256])),
index=['dog', 'cat'],
columns=['China', 'America', 'France'])
df2 = df.filter(items=['China', 'France'])#指定留下的数据
# 根据正则表达式删选列标签
df.filter(regex='a$',axis=1)#选取包含a的列,方向为1.
#选择⾏中包含og
df2 = df.filter(like='og',axis=0)
## 5、异常值过滤
df2 = pd.DataFrame(data = np.random.randn(10000,3)) # 正态分布数据
# 3σ过滤异常值,σ即是标准差
cond = (df2 > 3*df2.std()).any(axis=1)
index = df2[cond].index## 不满⾜条件的⾏索引
df2.drop(labels=index,axis=0)# 根据⾏索引,进⾏数据删除


## 第⼋部分 数据转换

### 第⼀节 轴和元素替换
import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)),
index = list('ABCDEFHIJK'),
columns=['Python','Tensorflow','Keras'])
df.iloc[4,2] = None#赋值空数据
#1、重命名轴索引
#df=df.rename(index={'A':'AA','B':'BB'},columns={'Python':'人工智能'},inplace = True)#表示原地替换
# 2、替换值:看起来只能指定某一个值来替换
df.replace(3,1024)##将3替换为1024
df.replace([0,7],2048)#将0和7替换为2048
df.replace({0:512,np.nan:998})# 根据字典键值对进⾏替换
df.replace({'Python':2},-1024)# 将Python这⼀列中等于2的,替换为-1024
### 第⼆节 map Series元素改变
import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)),
index = list('ABCDEFHIJK'),
columns=['Python','Tensorflow','Keras'])
df.iloc[4,2] = None # 空数据
#df
# 1、map批量元素改变,Series专有,只能针对一列
df['Keras'].map({1:'Hello',5:'World',7:'AI'})#字典映射,将数字1变为hello,其余数字为NaN
df['Python'].map(lambda x:True if x >=5 else False)#隐式函数映射
def convert(x):
    if x>=6 :
        return True
    else:
        return False
df['level']=df['Tensorflow'].map(convert)#映射是'Tensorflow中的每一个数据传递到方法中
### 第三节 apply元素改变。既⽀持 Series,也⽀持 DataFrame
import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)),
index = list('ABCDEFHIJK'),
columns=['Python','Tensorflow','Keras'])
df.iloc[4,2] = None # 空数据
# 1、apply 应⽤⽅法数据转换,通⽤
# Series,其中x是Series中元素
df1=df['Keras'].apply(lambda x:True if x > 5 else False)
#display(df,df1)
# DataFrame,其中的x是DataFrame中列或者⾏,是Series
df.apply(lambda x: x.median(),axis=0)#列的中位数
def convert(x):
    return (x.median().round(1),x.count())
df.apply(convert,axis=1)#行平均值,计数
# 2、applymap DataFrame专有
df.applymap(lambda x: x + 100)#计算DataFrame中每个元素

### 第四节 transform变形⾦刚
import numpy as np
import pandas as pd
df = pd.DataFrame(data = np.random.randint(0,10,size = (10,3)),
index = list('ABCDEFHIJK'),
columns=['Python','Tensorflow','Keras'])
df.iloc[4,2] = None # 空数据
# 1、⼀列执⾏多项计算
df['Python'].transform([np.sqrt,np.exp])## Series处理
#display(df,df1)
def convert(x):
    if x.mean() >5:
        x *= 10
    else:
        x *= -10
    return x
#df[['Python','Tensorflow']].transform(convert)
#2、多列执⾏不同计算
df.transform({'Python':convert,'Tensorflow':np.cumsum,'Keras':np.sqrt})


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值