Bootstrap

【Pandas数据处理】基础数据类型

本文主要介绍Pandas的数据类型、创建、常用属性、行列索引的操作等基本用法。Pandas基于两种数据类型:SeriesDataframeSeries是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基础数据类型的记录。

;