python分析数据结构_python 数据结构+数据处理

本文深入介绍了Pandas库中的Series和DataFrame数据结构,包括创建、追加、删除和切片操作。同时,详细讲解了如何对数据进行访问、修改索引、删除行或列,以及数据清洗。还涵盖了向量化计算、数据导入导出、数据处理函数如drop_duplicates和dropna等,并探讨了数据标准化、分组、抽样和日期处理等高级功能。通过实例展示了Pandas在数据分析中的强大功能。
摘要由CSDN通过智能技术生成

Pandas

1.数据结构

series

系列:是用于存储一行或者一列的数据,以及与之相关的索引的集合,序列比列表多了一个索引的概念

DataFrame

数据框

2. Series 创建,追加,与删除

Series(a,index = [])

s.append()

s.drop()

切片

from pandas importSeries#创建Series以及索引

x = Series(['a', True, 1,45,'2',67,98], index=['first', 'second', 'third','forth','fifth','sixth','seventh'])#x = Series(['a', True, 1]) 这种方式创建 索引会默认为是 0,1,2

#访问

print(x[1]);##根据index访问

print(x['second']);#不能追加单个元素 x.append('2')#追加一个序列

x = x.append(Series(['2'])) #若仅仅是x.append(Series(['2'])) 是不能追加成功到x的

x = x.append(Series(['2'])) #这种形式添加 两个索引值都为0#需要一个变量来承担

print( '2' in x) #默认的值为key 所为FALSE#判断值是否存在

print( '2' in x.values) #True#切片

print(x[1:3]) #包括1不包括3#定位获取,这个方法经常用于随机抽样

print(x[[0, 2, 1]])#根据index删除

x =x.drop(0)

x= x.drop('first')#根据位置删除

x = x.drop(x.index[0]) #因为这样x。drop里面是索引值了 用了x.index()

#根据值删除

x = x['2'!=x.values]

from pandas importSeries

x= Series(['a', True, 1], index=['first', 'second', 'third'])for v in x: #取指 而不是索引

print("x中的值 :", v)"""x中的值 : a

x中的值 : True

x中的值 : 1"""

3.DataFrame

Dataframe() 用字典+列表的方式,创建 表格并确定索引

切片

df.iloc[a:b,c:d] 行+列的切片 df.iloc[a] 列的切片 df.iloc[a:b,c:d] = [] 也可用来定位某一个格并修改

df.at[a,b] 行索引 +列名

df.columns

data.rename(columns={'日期':'购买日期'},inplace=True) 可用来修改列名

df.index 可以用来列出index 也可用来修改索引

df.drop 删除行或者列 要表明axis =0/1 不标默认为0

del df[列名] 切片删除列

df.loc[] = [几个列几个元素] 可以用来增加 也可以用来修改

df[列名] = [几行几个元素] 可以用来增加列

df.groupby(分组地段)[被分类字段].agg(函数)

df.iterrows() 返回两个值 第一格为index 第二格是行信息

df.apply(func,axis=0/1) 将行或列的每个元素基于函数判断

len(df)为几行

df[列名].astype(str) 整列转换成字符

from pandas importDataFrame#%%

df =DataFrame({'age': [21, 22, 23],'name': ['KEN', 'John', 'JIMI']

})#%%

df = DataFrame(data={'age': [21, 22, 23],'name': ['KEN', 'John', 'JIMI']

}, index=['first', 'second', 'third'])#%%#按列访问 打印出了该列的所有数值

print(df['age'])#%%#按行访问

print(df[1:2]) #打印出了第一行的数值#%%#按行列号访问

print(df.iloc[0:2, 0:1]) #打印出了[0-2)行 [0-1)列的单元格#%%

#按行索引,列名访问

print(df.at['first', 'name'])#%%#修改列名

df.columns=['age2', 'name2']#%%#修改行索引

df.index = range(1,4) #把索引改成了123#%%

print(df.index) #RangeIndex(start=1, stop=4, step=1)#%%#根据行索引删除

df = df.drop(1, axis=0) #删除了第一行 axis= 0 是指行 =1 是指列#%%#默认参数axis=0#根据列名进行删除

df = df.drop('age2', axis=1)#%%#第二种删除列的方法

del df['age2']#%%#增加行,注意,这种方法,效率非常低,不应该用于遍历中

df.loc[len(df)] = [24, "KENKEN"]#%%

df.loc[2] = [24, "KENKEN"] #也可以用来修改#%%#增加列

df['newColumn'] = [2, 4, 6, 8]

importnumpyfrom pandas importDataFrame

df=DataFrame({'key1': ['a','a','b','b','a'],'key2': ['one','two','one','two','one'],'data1': numpy.random.randn(5),'data2': numpy.random.randn(5) #随机生成5个数字

});#%%

df2 = df.groupby('key1')['data1','data2'].agg(lambda arr:arr.max()-arr.min())#agg 聚合函数 将data1 和 data2 根据key1 的值进行聚合分组#%%

arr1= numpy.random.randn(2,4)print(arr1) #返回两行四列的矩阵,内容为从标准正态分布中返回一个或多个样本值

from pandas importSeriesfrom pandas importDataFrame

df=DataFrame({'age': Series([21, 22, 23]),'name': Series(['KEN', 'John', 'JIMI'])

})#%%#遍历列名

for r indf:print(r);#%%#遍历列

for cName indf:print('df中的列 :\n', cName)print('df中的值 :\n', df[cName]);print("---------------------")#%%#遍历行,方法一

for rIndex indf.index:print('现在是第', rIndex, '行')print(df.iloc[rIndex])#%%#遍历行,方法二

for r indf.values:print(r)print(r[0])print(r[1])print("---------------------")#%%#遍历行,方法三

for index, row indf.iterrows():print('第', index, '行:')print(row)print("---------------------")

print(df.apply(lambda x: min(x))) #选出每列的最小值

print(df.apply(lambda x: min(x), axis=1)) #选出每行的最小值#%%#判断每个列,值是否都大于0

print(df.apply(lambda x: numpy.all(x>0), axis=1)) #是否每行都大于0#%%#结合过滤

print(df[df.apply(lambda x: numpy.all(x>0), axis=1)]) #选出每个元素都大于0 的行

4. 向量化计算

同一时间执行多次操作,对不同的数据执行同样的一个或一批指令

函数运算:相同位置的数据进行函数的计算,函数返回结果保留在相同的位置

四则运算,相同位置的数据进行运算,结果保留在相同的位置,直到和长的变量长度一致

如果两个向量长度不一样,就会使用rep方法,将短的变量不断重复

r[r>0.3]: 选出矩阵r中>0.3 的元素

5.导入导出文本

file 文件路径, names :列名,默认文件中的第一行作为列名,

sep:分隔符,默认为空,表示默认导入为一列

encoding: 设置文件编码,在导入中文时需要设置为UTF-8

read_csv(file,encoding) 导入csv 文件(是用逗号做分隔符号)

read_table(file,names=[列1,列2,....], sep = "", encoding,....) 导入普通文本文件

read_excel(file,sheetname,header) /路径+sheet 名字 + 列名(默认为第一行) 导入excel 文件 ,header 是数字表示第几行作为列名

to_csv(filepath,sep=",",index = TRUE,header = TRUE) index=True 为导出行序号, header = True 导出列名: 导出文本文件

from pandas importread_csv;#%%

df1 = read_csv('/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.1/1.csv', encoding='UTF-8')#%%#下载notepad++ 解决中文乱码, 修改文件编码 mac 不支持

from pandas importread_table;

df2= read_table('/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.1/2.txt', names=['age', 'name'], sep=',')#%%

from pandas importread_excel;

df3= read_excel('/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.1/3.xlsx','data',0)#%%

#coding UTF-8

from pandas importDataFrame

df4= read_table('/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.1/中文.txt', sep=',', encoding='UTF-8')#%%

df5=DataFrame({'age': [21, 22, 23],'name': ['KEN', 'John', 'JIMI']

});

df5.to_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.2/df123456.csv");#%%

df5.to_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.2/df56789.csv", index=False)

6. 数据处理函数

(1)数据清洗

drop_duplicates()   处理重复值,行相同的数据只保留一行

from pandas importSeriesfrom pandas importDataFramefrom pandas importread_csvimportpandasimportnumpy#%%

df6= read_csv('/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.3/data.csv')

newDF= df6.drop_duplicates() #重复数据 删除重复数据

dropna()       去除数据结构中值为空的数据

df7 = read_csv('/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.4/data.csv')#%%

newDF2= df7.dropna() #缺失数据处理 是删掉

缺失值的产生: 有些信息暂时无法获取,有些信息被遗漏或者错误处理

缺失值的处理方式: 数据补齐,删除对应缺失行,不处理

(3)数据加工

slice(start,stop)   字段抽取,相当于切片

#4.6字段抽取

df= read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.6//data.csv")

df['tel'] = df['tel'].astype(str) #原本是数字形式,转换成字符形式

#运营商

bands = df['tel'].str.slice(0, 3)

df['bands']=bands#地区

areas = df['tel'].str.slice(3, 7)

df['areas']=areas#号码段

nums = df['tel'].str.slice(7, 11)

df['nums']=nums

split(sep,n,expand=False) 字段拆分,sep:分隔符,n:分割次数,expand=true 返回dataframe, = flase 返回series

#4.7 字段拆分

df1= read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.7/data.csv")

newDF= df1['name'].str.split(' ', 1, True)

newDF.columns= ['band', 'name']

str.strip() 去掉空格

df8 = read_csv('/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4/4.5//data.csv')

newName3= df8['name'].str.strip() #去掉左右空格 输出series

df8['name'] = newName3 #再替换进去

dataframe[过滤条件]   记录抽取,根据一定的条件对数据进行抽取 返回dataframe

df.[pandas.isnull(df.title)]

df.[df.comments.between(1000,10000)]

df = read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.8//data.csv", sep="|")print(df[df.comments>10000])print(df[df.comments.between(1000, 10000)])print(df[pandas.isnull(df.title)])print(df[df.title.str.contains('台电', na=False)])print(df[(df.comments>=1000) & (df.comments<=10000)])

isnull()   空值匹配

str.contains(pattern, na = false) df[df.title.str.contains('台电',na=False)]

concat([dataFrame1, dataFrame2,....) 记录合并

df1 = read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.10//data1.csv", sep="|")

df2= read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.10//data2.csv", sep="|")

df3= read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.10//data3.csv", sep="|")

df= pandas.concat([df1, df2, df3])

+   字符合并 合并后产生Series

df =read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.11//data.csv",

sep=" ",

names=['band', 'area', 'num']

)

df=df.astype(str)

tel= df['band'] + df['area'] + df['num']

df['tel']=tel

pandas.merge(表1,表2,表1用于匹配的列,表2 用于匹配的列) 字段匹配 类似于 联结

items =read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.12//data1.csv",

sep='|',

names=['id', 'comments', 'title']

)

prices=read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.12//data2.csv",

sep='|',

names=['id', 'oldPrice', 'nowPrice']

)

itemPrices=pandas.merge(

items,

prices,

left_on='id',

right_on='id')

数据标准化

scale = (df.score-df.score.min())/(df.score.max()-df.score.min())

cut(series,bins,right=True,labels=Null) 需要分组的数据/分组的划分数组/分组的时候,右边是否闭合/分组的自定义标签,可以不自定义

df = read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.15//data.csv", sep='|')

bins= [min(df.cost)-1, 20, 40, 60, 80, 100, max(df.cost)+1]

labels= ['20以下', '20到40', '40到60', '60到80', '80到100', '100以上']print(pandas.cut(df.cost, bins))print(pandas.cut(df.cost, bins, right=False))print(pandas.cut(df.cost, bins, right=False, labels=labels))

df['series'] = pandas.cut(df.cost, bins, right=False, labels=labels)

date = to_datetime(dateString,format) 字符型转日期型

from pandas import to_datetime#%%

df= read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.16//data.csv", encoding='utf8')

df_dt= to_datetime(df.注册时间, format='%Y/%m/%d')

apply(lambda x:处理逻辑) datetime.strftime(x,format)

from datetime import datetime#%%

df_dt_str= df_dt.apply(lambda x: datetime.strftime(x, '%d-%m-%Y'))

dt.property property 是指 second minute hour day month year weekday

print(df_dt.dt.year)print(df_dt.dt.second)print(df_dt.dt.minute)

(3)数据抽样

numpy.random.randint(start,end,num) 随机抽样

df = read_csv("/Volumes/CHASESKY/python/03-数据分析与数据挖掘篇/1-数据分析数据可视化实战-(Python3.5)/章节4数据处理/4//4.9//data.csv")

r = numpy.random.randint(0, 10, 3)

df1=df.loc[r, :]

NUMPY

生成等差数列:

numpy.arange(start,end,step):

importnumpy

r= numpy.arange(0.1, 0.5, 0.01) #range() 不能生成小数范围的

numpy.power(a,b) a的元素的b次方 向量化运算

numpy.dot(r, r.T) 进行矩阵运算

numpy.all(判断标准 ) 对矩阵的所有元素进行判断

numpy.random.randint(start,end,num) 开始值,结束值,抽样个数 行数的索引值序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值