本文主要介绍Pandas的数据类型、创建、常用属性、行列索引的操作等基本用法。Pandas基于两种数据类型:Series与Dataframe。Series是Pandas中最基本的对象,Series类似一种一维数组,Series 能为数据自定义标签,也就是索引( index ),然后通过索引来访问数组中的数据。Dataframe是一个二维的表结构。Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自己的标签。
文章目录
在使用pandas时,DataFrame、Serise 单词里面D、F、S一定要大写哦~,不然很容易出错。
1、Series
Series 是一种类似于一维数组的对象,由index 和 values 两个部分组成,index:相关数据的索引标签,values:一组数据(ndarray类型)。其中index 参数是可省略的,可以选择不输入这个参数,Pandas 会自动用默认 index 进行索引,类似数组,索引值是 [0,len(data) - 1]。
(1)创建Series对象
from pandas import Series,DataFrame
#默认索引
sel = Series([1,2,3,4])
print(sel)
#自定义索引
sel1 = Series(data=[1,2,3,4],index=list("abcd"))
print(sel1)
sel2 = Series(data=[1,2,3,4],index=["a","b","c","d"])
print(sel2)
# 将字典转换为series
dict={"red":100,"black":400,"green" :300, "pink":900}
sel3=Series(dict)
print(sel3)
输出结果:
(2)获取Series数据
获取全部数据
from pandas import Series,DataFrame
sel = Series(data=["a","b","c","d"],index=[1,2,3,4])
#获取索引
print(sel.index)
# 输出结果:Int64Index([1, 2, 3, 4], dtype='int64')
#获取数值
print(sel.values)
# 输出结果:['a' 'b' 'c' 'd']
# 获取索引和值对
print(list(sel.iteritems()))
# 输出结果[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
获取单个数据
series对象同时支持位置和标签两种方式获取数据。
from pandas import Series,DataFrame
sel = Series(data=["a","b","c","d"],index=[1,2,3,4])
print("索引下标",sel["c"])
print("位置下标",sel[2])
# 输出结果:索引下标 3
# 输出结果:位置下标 3
获取多个数据
Series可以使用下标获取不连续的数据、或切片获取不连续数据。
from pandas import Series,DataFrame
sel = Series(data=[1,2,3,4],index=["a","b","c","d"])
#获取不连续的数据
print("索引下标",sel[["a","c"]])
#输出结果:索引下标 a 1
# c 3
print("位置下标",sel[[1,3]])
# 输出结果:位置下标 b 2
# d 4
#--------------------------分割线--------------------------------#
#获取连续的数据,可以使用切片取数据
#位置切片,左包含右不包含,sel[1:3],包含1、2不包含3
print("位置切片",sel[1:3])
# 输出结果:位置切片 b 2
# c 3
# 索引切片,左右都包含,sel["b":"d"],包含b,c,d
print("索引切片",sel["b":"d"])
# 输出结果:索引切片 b 2
# c 3
# d 4
(3)修改Series数据
根据下标修改Series的单个数据,也可重新赋值索引。
from pandas import Series,DataFrame
import pandas as pd
sel = Series(data=[1,2,3,4],index=["a","b","c","d"])
print(sel)
# 输出结果:
# a 1
# b 2
# c 3
# d 4
# dtype: int64
# 修改单个元素,利用位置下标和索引下标直接修改
sel["d"]=8
sel[0]=5
print(sel)
# 输出结果:
# a 5
# b 2
# c 3
# d 8
# dtype: int64
# 重新赋值索引的值
sel.index = list('dcba')
print(sel)
# 输出结果:
# d 5
# c 2
# b 3
# a 8
# dtype: int64
# # ReIndex重新索引,会返回一个新的Series(调用reindex将会重新排序,缺失值则用NaN填补)
print(sel.reindex(['b','a','c','d','e']))
# 输出结果:
# b 3.0
# a 8.0
# c 2.0
# d 5.0
# e NaN
# dtype: float64
(4)删除Series数据
del sel[index] 删除数据,原Series改变;sel.pop(index) 删除数据,返回删除数据,原Series改变;sel.drop(index)删除数据,返回删除数据后新的Series,原Series不变。
from pandas import Series,DataFrame
import pandas as pd
sel = Series(data=[1,2,3,4],index=["a","b","c","d"])
# del删除数据 ,del sel[index] 中的index仅支持索引下标,不支持位置下标,del sel[0] 会报错
del sel["b"]
print(sel)
# 输出结果:
# a 1
# c 3
# d 4
# dtype: int64
# pop删除数据,返回删除数据,原Series变化
print(sel.pop("a")) #输出:1
print(sel)
# 输出结果:
# c 3
# d 4
# dtype: int64
# Drop删除数据,返回新Series,原Series保持不变
print(sel.drop("c"))
# 输出结果:
# d 4
# dtype: int64
print(sel)
# 输出结果:
# c 3
# d 4
# dtype: int64
2、Dataframe
DataFrame( 数据表)是一种 2 维数据结构,数据以表格的形式存储,分成若干行和列。常见的操作比如选取、替换行或列的数据,还能重组数据表、修改索引、多重筛选等。我们可以把 DataFrame 理解成一组采用同样索引的 Series 的集合。调用DataFrame()可以将多种格式的数据转换为DataFrame对象,它的的三个参数data、index和columns分别为数据、行索引和列索引。
(1)DataFrame的创建
- 使用二维数组创建
- 使用字典创建
- 使用from_dict方法创建
示例代码如下:
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
# 1、使用二维数组
df1 = DataFrame(np.random.randint(0,10,(4,4)),index=[1,2,3,4] , columns=['a' , 'b' , 'c' ,'d'])
print(df1)
# 输出结果:
# a b c d
# 1 3 2 8 6
# 2 2 9 5 6
# 3 3 9 3 7
# 4 3 0 3 1
# 2、使用字典创建(行索引由index决定,列索引由字典的键决定)
dict={'province' : ['Guangdong','beijing','qinghai','fujian'] ,
'pop': [1.3,2.5,1.1,0.7],
'year':[2018,2018,2018,2018]}
df2=pd.DataFrame(dict,index=[1,2,3,4])
print(df2)
#输出结果:
# province pop year
# 1 Guangdong 1.3 2018
# 2 beijing 2.5 2018
# 3 qinghai 1.1 2018
# 4 fujian 0.7 2018
# 3、使用from_dict
dict2={"a":[1,2,3],"b":[4,5,6]}
df3=pd.DataFrame.from_dict(dict2)
print(df3)
# 输出结果
# a b
# 0 1 4
# 1 2 5
# 2 3 6
#4、索引相同的情况下,相同索引的值会相对应,缺少的值会添加NaN
data = {'Name':pd.Series(['zs' , '1s' , 'we'] , index=['a' , 'b' , 'c']),
'age':pd.Series(['10' , '20' , '30' , '40'] ,index=['a' , 'b' , 'c' , 'd']),
'country':pd.Series(['中国','日本','韩国'],index=['a','c','b'])}
df = pd.DataFrame(data)
print(df)
# 输出结果
# Name age country
# a zs 10 中国
# b 1s 20 韩国
# c we 30 日本
# d NaN 40 NaN
# 5、to_dict(0)方法将DataFrame对象转换为字典
dict = df.to_dict()
print(dict)
#输出结果
# {'Name': {'a': 'zs', 'b': '1s', 'c': 'we', 'd': nan},
# 'age': {'a': '10', 'b': '20', 'c': '30', 'd': '40'},
# 'country': {'a': '中国', 'b': '韩国', 'c': '日本', 'd': nan}}
(2)DataFrame对象常用属性
df.shape: 获取行数和列数
df.info(): 查看数据基本信息
df.head(): 显示头几行,默认为5,可修改
df.tail(): 显示后几行,默认为5,可修改
df.index.tolist(): 获取行索引
df.columns.tolist(): 获取列索引
df.dtypes: 获取数据类型
df.ndim: 获取数据的维度
df.values: values属性也会以二维ndarray的形式返回DataFrame的数据
代码示例如下:
import pandas as pd
data = {'Name':pd.Series(['zs' , '1s' , 'we'] , index=['a' , 'b' , 'c']),
'age':pd.Series(['10' , '20' , '30' , '40'] ,index=['a' , 'b' , 'c' , 'd']),
'country':pd.Series(['中国','日本','韩国'],index=['a','c','b'])}
df = pd.DataFrame(data)
print(df)
# 输出结果:
# Name age country
# a zs 10 中国
# b 1s 20 韩国
# c we 30 日本
# d NaN 40 NaN
print("获取行数和列数:",df.shape) # 获取行数和列数: (4, 3)
df.info() #查看数据基本信息
# 输出结果:
# <class 'pandas.core.frame.DataFrame'>
# Index: 4 entries, a to d
# Data columns (total 3 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 Name 3 non-null object
# 1 age 4 non-null object
# 2 country 3 non-null object
# dtypes: object(3)
# memory usage: 128.0+ bytes
print("显示头2行,默认显示5行:",df.head(2))
# 输出结果:
# 显示头2行,默认显示5行:
# Name age country
# a zs 10 中国
# b 1s 20 韩国
print("显示后1行:",df.tail(1))
# 输出结果:
# 显示后1行:
# Name age country
# d NaN 40 NaN
print("获取行索引:",df.index.tolist()) #获取行索引: ['a', 'b', 'c', 'd']
print("获取列索引:",df.columns.tolist()) #获取列索引: ['Name', 'age', 'country']
print("获取数据的类型:",df.dtypes) #
# 输出结果:
# 获取数据的类型:
# Name object
# age object
# country object
print("获取数据的维度:",df.ndim) #获取数据的维度: 2
# *values属性也会以二维ndarray的形式返回DataFrame的数据
print(df.values)
# 输出结果:
# [['zs' '10' '中国']
# ['1s' '20' '韩国']
# ['we' '30' '日本']
# [nan '40' nan]]
(3)DataFrame读取数据iloc、loc
位置索引即图片中红色整数部分从0开始,标签索引即图片中abcd是自定义添加的,不自定义时默认就是位置索引。df[]可以获取一行一列、多行多列数据,df.iloc[]和df.loc[] 可以获取一行一列、多行多列数据、某行某列数据。
df[column1]:获取一列,返回结果为一个Series
df[column1,column2,…]:获取多列,返回结果为一个DataFrame
df[index1:index2]:切片获取多行数据,与Series一样,位置下标切片(0,1,2,3…)左包含右不包含;索引下标(自定义下标)切片左右都包含。
代码示例如下:
import pandas as pd
data = {'Name':pd.Series(['zs' , '1s' , 'we'] , index=['a' , 'b' , 'c']),
'age':pd.Series(['10' , '20' , '30' , '40'] ,index=['a' , 'b' , 'c' , 'd']),
'country':pd.Series(['中国','日本','韩国'],index=['a','c','b'])}
df = pd.DataFrame(data)
print("获取DataFrame的列",df['Name'])
# 输出数据:
# 获取DataFrame的列
# a zs
# b 1s
# c we
# d NaN
# Name: Name, dtype: object
#因为我们只获取一列,所以返回的就是一个 series
print(type(df['Name'])) #<class 'pandas.core.series.Series'>
# 如果获取多个列,那返回的就是一个 DataFrame 类型:
print(df[['Name' , 'age']])
# 输出结果:
# Name age
# a zs 10
# b 1s 20
# c we 30
# d NaN 40
print(type(df[['Name' , 'age']])) #<class 'pandas.core.frame.DataFrame'>
# 获取一行
print(df[0:1]) #位置切片,左包含右不包含
# 输出结果:
# Name age country
# a zs 10 中国
# 获取多行
print(df["a":"b"]) #索引切片,左右都包含
# 输出结果:
# Name age country
# a zs 10 中国
# b 1s 20 韩国
print(df[1:3])
# 输出结果:
# Name age country
# b 1s 20 韩国
# c we 30 日本
df.loc[index1:index2,column1:column2] :通过标签索引行数据
df.iloc[index1:index2,column1:column2] :通过位置获取行数据
代码示例如下:
import pandas as pd
data = {'Name':pd.Series(['zs' , '1s' , 'we'] , index=['a' , 'b' , 'c']),
'age':pd.Series(['10' , '20' , '30' , '40'] ,index=['a' , 'b' , 'c' , 'd']),
'country':pd.Series(['中国','日本','韩国'],index=['a','c','b'])}
df = pd.DataFrame(data)
print(df)
# 获取某一行、所有列
print(df.loc['a'])
print(df.loc['a',:])
print(df.iloc[0])
print(df.iloc[0,:])
# 输出结果:
# Name zs
# age 10
# country 中国
# Name: a, dtype: object
# 获取某一行、固定列数据
print(df.loc['a','Name']) # zs
print(df.iloc[0,0]) # zs
# 获取多行、多列
# 标签索引切片时左右都包含
print(df.loc['a':'c',"Name":"age"])
# 输出结果:
# Name age
# a zs 10
# b 1s 20
# c we 30
# 位置索引切片是左包含右不包含
print(df.iloc[0:2,0:1])
# 输出结果:
# Name
# a zs
# b 1s
# 获取多行、固定列
print(df.loc['a':'c',["Name","country"]])
# 输出结果:
# Name country
# a zs 中国
# b 1s 韩国
# c we 日本
print(df.iloc[0:2,[0,2]])
# 输出结果:
# Name country
# a zs 中国
# b 1s 韩国
(4)DataFrame修改index、columns
- 修改index
1.换掉所有index名称,df.index = list
2.使用rename()方法传入字典,为某个 index 单独修改名称
3.使用reset_index()方法将index重置为默认的整数索引
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=‘’)
level:数值类型可以为:int、str、tuple或list,默认无,仅从索引中删除给定级别。默认情况下移除所有级别。控制了具体要还原的那个等级的索引 。
drop:当指定drop=False时,则索引列会被还原为普通列;否则,经设置后的新索引值被会丢弃。默认为False。
inplace:输入布尔值,表示当前操作是否对原数据生效,默认为False。
col_level:数值类型为int或str,默认值为0,如果列有多个级别,则确定将标签插入到哪个级别。默认情况下,它将插入到第一级。
col_fill:对象,默认‘’,如果列有多个级别,则确定其他级别的命名方式。如果没有,则重复索引名。
4.使用set_index()方法将现有的列设置为新的index
DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
keys:列标签或列标签/数组列表,需要设置为索引的列
drop:默认为True,删除用作新索引的列
append:是否将列附加到现有索引,默认为False。
inplace:输入布尔值,表示当前操作是否对原数据生效,默认为False。
verify_integrity:检查新索引的副本。否则,请将检查推迟到必要时进行。将其设置为false将提高该方法的性能,默认为false。
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(9).reshape(3, 3), index = ['bj', 'sh' , 'gz'],columns=['a' ,'b','c'])
print(df1)
# 输出结果
# a b c
# bj 0 1 2
# sh 3 4 5
# gz 6 7 8
# 1.仅换掉index名称,df.index = list
df1.index = ['beijing' , 'shanghai' ,'guangzhou']
print(df1)
# a b c
# beijing 0 1 2
# shanghai 3 4 5
# guangzhou 6 7 8
#2.使用rename()方法传入字典,为某个 index 单独修改名称
df1= df1.rename(index={'beijing' : 'bj'})
print(df1)
# a b c
# bj 0 1 2
# shanghai 3 4 5
# guangzhou 6 7 8
# 3.使用reset_index()方法将index重置为默认的整数索引,默认原index会变成一个新列通过 drop=True\false设置
# inplace: 布尔值,默认为False,是否返回新的DataFrame。如果为True,则忽略复制值。
df1.reset_index(inplace=True)
print(df1)
# index a b c
# 0 bj 0 1 2
# 1 shanghai 3 4 5
# 2 guangzhou 6 7 8
# 4.使用set_index()方法将现有的列设置为新的index
df1.set_index('a',inplace=True)
print(df1)
# index b c
# a
# 0 bj 1 2
# 3 shanghai 4 5
# 6 guangzhou 7 8
- 修改columns
1.仅换掉columns名称,df.columns = list
2.使用rename()方法传入字典,为某个 columns 单独修改名称
inplace参数: 布尔值,默认为False,是否返回新的DataFrame。如果为True,则忽略复制值。
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(9).reshape(3, 3), index = ['bj', 'sh' , 'gz'],columns=['a' ,'b','c'])
print(df1)
# 输出结果
# a b c
# bj 0 1 2
# sh 3 4 5
# gz 6 7 8
# 1.仅换掉columns名称,df.columns = list
df1.columns = ['beijing' , 'shanghai' ,'guangzhou']
print(df1)
# beijing shanghai guangzhou
# bj 0 1 2
# sh 3 4 5
# gz 6 7 8
#2.使用rename()方法传入字典,为某个 columns 单独修改名称
# inplace: 布尔值,默认为False,是否返回新的DataFrame。如果为True,则忽略复制值。
df1.rename(columns={'beijing' : 'bj'},inplace=True)
print(df1)
# bj shanghai guangzhou
# bj 0 1 2
# sh 3 4 5
# gz 6 7 8
以上是对Pandas两种数据类型Series与Dataframe基础数据类型的记录。