学习笔记Python之Pandas

Pandas 数据结构—Series

Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。

Series由索引(index)和列组成,函数如下:

pandas.Series(data,index,dtype,name,copy)

参数说明

  • data:一组数据(ndarray类型)
  • index:数据索引标签,如果不指定,认从0开始
  • dtype:数据类型,认会自己判断
  • name:设置名称
  • copy:拷贝数据,认为False

创建一个简单的Series实例:

import pandas as pd
a = [1,2,3]
myvar = pd.Series(a)
print(myvar)

输出结果如下:

 

 从上图可知,如果没有指定索引,索引值就从0 开始,我们可以根据索引值读取数据:

import pandas as pd
a = [1,2,3]
myvar = pd.Series(a)
print(myver[1])

输出结果为:

2

我们可以指定索引值,如下例:

import pandas as pd
a = ["Google","Runoob",'Wiki']
myvar = pd.Series(a,index = ["x","y","z"])
print(myvar)

输出结果如下:

 

 根据索引值读取数据:

import pandas as pd
a = ["Google","Runoob",'Wiki']
myvar = pd.Series(a,index = ["x","y","z"])
print(myvar["y"])

输出结果如下:

Runoob

我们也可以使用key/value对象,类似字典来创建Series:

import pandas as pd
sites = {1:"Google", 2:"Runoob", 3:"Wiki"}
myvar = pd.Series(sites)
print(myvar)

输出结果如下:

 

 从上图可知,字典的key变成了索引值。

如果我们只需要字典的中的一部分数据,只需要指定需要数据的索引即可,如下实例:

import pandas as pd
sites = {1:"Google", 2:"Runoob", 3:"Wiki"}
myvar = pd.Series(sites,index = [1,2])
print(myvar)

输出结果如下:

 

 设置Series名称参数:

import pandas as pd
sites = {1:"Google", 2:"Runoob", 3:"Wiki"}
myvar = pd.Series(sites,index = [1,2],name = "RUNOOB-Series-TEST")
print(myvar)

输出结果如下:

 

 Pandas数据结构 - DataFrame

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame既有行索引也有列索引,它可以被看作是由Series组成的字典(共同用一个索引)

 

 

 

 DataFrame构造方法如下:

pandas.DataFrame(data,index,columns,dtype,copy)

参数说明:

  • data:一组数据(ndarray、series、map、lists、dict等类型)
  • index:索引值,或者可以称为行标签
  • columns:列标签认为RangeIndex(0,1,2,...,n)
  • dtype:数据类型
  • copy:拷贝数据,认为False

Pandas DataFrame 是一个二维的数组结构,类似二维数组

#使用列表创建
import pandas as pd
data = [["Google",10],[“Runoob”,12],["Wiki",13]]
df = pd.DataFrame(data,columns = ['Site','Age'],dtype = float)
print(df)

输出结果如下:

 

 

以下实例用ndarrays 创建,ndarray 的长度必须相同,如果传递了index,则索引的长度应等于数组的长度,如果没有传递索引,则认情况下,索引将是range(n),其中n是数组长度。

#使用ndarrays创建
import pandas as pd
data = {'Site':['Google','Runoob','Wiki'],'Age':[10,12,13]}

#这里数组指的是['Google','Runoob','Wiki'],[10,12,13]
df = pd.DataFrame(data) 

print(df)

输出结果如下:

 

 由以上输出结果可知,DataFrame数据类型一个表格,包括rows(行),和columns(列)

 

 还可以使用字典(key/value),其中字典的key为列名:

#使用字典创建
import pandas as pd
data = [{'a':1, 'b':2},{'a':5, 'b':10, 'c':20}]
df = pd.DataFrame(data)
print(df)

输出结果为

 

 没有对应的部分数据为NaN

 

Pandas可以使用loc属性返回指定行的数据,如果没有设置索引,第一行索引为0,第二行索引为1,以此类推:

import pandas as pd

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)

# 返回第一行
print(df.loc[0])
# 返回第二行
print(df.loc[1])

输出结果如下:注意:返回结果其实就是一个Pandas Series数据。

 

#也可以返回多行数据,使用[[...]]格式,...为各行索引
import pandas as pd data = { "calories": [420, 380, 390], "duration": [50, 40, 45] } # 数据载入到 DataFrame 对象 df = pd.DataFrame(data) # 返回第一行和第二行 print(df.loc[[0, 1]])

 输出结果为:注意:返回结果其实就是一个Pandas DataFrame 数据

 

 

#我们可以指定索引值,如下实例:
import pandas as pd
data = {
    "calories":[420,380,390],
    "duration":[50,40,45]
}

df = pd.DataFrame(data, index = ["day1","day2","day3"])

print(df)

 

 输出结果为:

 

 Pandas可以使用loc属性返回指定索引对应到某一行:

import pandas as pd
data = {
    "calories":[420,380,390],
    "duration":[50,40,45]
}

df = pd.DataFrame(data, index = ["day1","day2","day3"])

#指定索引
print(df.loc["day2"])

 

输出结果为:

 

 Pandas CSV文件

CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)

CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。

Pandas可以很方便的处理CSV文件

import pandas as pd

df = pd.read_csv("nba.csv")

print(df.to_string())

 to_string() 用于返回DataFrame类型的数据,如果不使用该函数,则输出结果为数据的前面5行和末尾5行,中间部分以...代替。使用了to_string相当于全部输出

import pandas as pd

df = pd.read_csv('nba.csv')

print(df)

 

输出结果为:

 

 

 我们也可以使用to_csv()方法将DataFrame存储为csv文件

import pandas as pd

#三个字段 name,site,age
nme = ["Google","Runoob","Taobao","Wiki"]
st = ["www.google.com","www.runoob.com","www.taobao.com","www.wikipedia.org"]
ag = [90,40,80,98]

#字典
dict = {'name':nme,'site':st,'age':ag}

df = pd.DataFrame(dict)

#保存 dataframe
df.to_csv('site.csv')

 

执行成功后,我们打开site.csv文件显示结果如下:

 

 

 数据处理

1.head()

head(n)方法用于读取前面的n行,如果不填参数n,认返回5行。

import pandas as pd

df = pd.read_csv("nba.csv")

print(df.head())

 

输出结果为:

 

 

 2.tail()

tail(n)方法用于读取尾部的n行,如果不填参数n,认返回5行,空行各个字段的值返回NaN

import pandas as pd

df = pd.read_csv("nba.csv")

print(df.tail())

 

输出结果为:

 

 3.info()

info()方法返回表格的一些基本信息:

import pandas as pd

df = pd.read_csv("nba.csv")

print(df.info())

 

输出结果为:

 

 non-null为非空数据,我们可以看到上面的信息中,总共458行,College字段的空值最多。


 

Pandas 数据清洗

数据清洗是对一些没有用的数据进行处理的过程。

很多数据集存在数据缺失、数据格式错误错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。

本文使用到的测试数据如下:

 

 上表包含了四种空数据:

  • n/a
  • NA
  • na

1 Pandas清洗空值

如果我们要删除包含空字段的行,可以使用dropna()方法,语法格式如下:

DataFrame.dropna(sxis = 0,how = 'any',thresh = None,subset = None,inplace = False)

 

参数说明:

  • axis:认为0,表示逢空值剔除整行,如果设置参数 axis = 1表示逢空值去掉整列
  • how:认为'any'如果一行(或一列)里任何一个数据有出现NA就去掉整行,如何设置how = 'all'一行(或列)都是NA才去掉这整行
  • thresh:设置需要多少非空值的数据才可以保留下来的。
  • subset:设置想要检查的列。如果是多个列,可以使用列名的list作为参数
  • inplace:如果设置True,将计算得到的值直接覆盖之前的值并返回None,修改的是源数据。

我们可以通过isnull()判断各个单元格是否为空。

import pandas as pd

df = read_csv("property-data.csv")

print(df['NUM_bedROOMS'])
print(df['NUM_bedROOMS']).isnull()

 

以上实例输出结果如下:

 

 以上例子中我们看到Pandas把n/a和NA当作空数据,而认为na不是空数据,不符合我们要求,我们可以指定空数据类型:

import pandas as pd

missing_values = ["n/a", "na", "--"]
df = read_csv("property-data.csv", na_values = missing_values)

print(df['NUM_bedROOMS'])
print(df['NUM_bedROOMS']).isnull()

以上实例输出结果如下:

 

 接下来的实例演示了删除包含空数据的行。

import pandas as pd

df = pd.read_csv("property-data.csv")

new_df = df.dropna()

print(new_df.to_string())

 

以上实例输出结果如下:

 

 注意:认情况下,dropna()方法返回一个新的DataFrame,不会修改源数据。

如果你要修改源数据DataFrame,可以使用inplace = True 参数:

import pandas as pd

df = pd.read_csv('property-data.csv')

df.dropna(inplace = True)

print(df.to_string())

 

以上实例输出结果如下:

 

 我们也可以移除指定列有空值的行:

import pandas as pd

df = pd.read_csv("property-data.csv")

df.dropna(subset = ['ST_NUM'],inplace = True)

print(df.to_string())

 

以上实例输出结果如下:

 

 我们也可以用fillna()方法来替换一些空字段:

import pandas as pd

df = pd.read_csv("property-data.csv")

df.fillna(12345,inplace = True)

print(df.to_string())

 

以上实例输出结果如下:

 

 我们也可以指定某一个列来替换数据:

import pandas as pd

df = pd.read_csv('property-data.csv')

df['PID'].fillna(12345, inplace = True)#指定替换PID列的空数据

print(df.to_string())

 

以上实例输出结果如下:

 

 替换空单元格的常用方法是计算列的均值、中位数值或众数。

Pandas使用mean()、median()和mode()方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数)。

#使用mean()方法计算列的均值并替换空单元格
import pandas as pd

df = pd.read_csv("property-data.csv")

x = df["ST_NUM"].mean()   #同理可以换成中位数median()、众数mode()

df["ST_NUM"].fillna(x,inplace = True)

print(df.to_string())

 

以上实例输出结果如下,红框为计算的均值替换来空单元格:

 

2 Pandas清洗格式错误数据

数据格式错误的单元格会使数据分析变得困难,我们可以通过包含空单元格的行,或者将列中的所有单元格转换为相同格式的数据

以下实例会格式化日期:

import pandas as pd

#第三个日期格式错误
data = {
    "Date":['2020/12/01', '2020/12/02', '20201226']
    "duration":[50, 40, 45]
}
df = pd.DataFrame(data, index = ["day1","day2","day3"])

df["Date"] = pd.to_datetime(df["Date"])

print(df.to_string())

 

以上实例输出结果如下:

 

 数据错误也是很常见的情况,我们可以对错误的数据进行替换或者移除。

以下实例会替换错误年龄的数据:

import pandas as pd

person = {
    "name":['Google','Runoob','Taobao'],
    "age":[50,40,12345] #这里12345 年龄数据是错误的
}
df = pd.DataFrame(person)

df.loc[2,'age'] = 30 #修改数据

print(df.to_string())

 

以上实例输出结果如下:

 

 也可以设置条件语句:

#将age大于120的设置为120
import pandas as pd

person = {
    "name":['Google','Runoob','Taobao'],
    "age":[50,200,12345] 
}
df = pd.DataFrame(person)

for x in df.index:
        if df.loc[x,"age"]>120:
                df.loc[x,"age"] = 120

print(df.to_string())

 

以上实例输出结果如下:

也可以将错误的数据的行删除

#将age大于120的设置为删除
import pandas as pd

person = {
    "name":['Google','Runoob','Taobao'],
    "age":[50,40,12345] 
}
df = pd.DataFrame(person)

for x in df.index:
        if df.loc[x,"age"]>120:
                df.drop(x,inplace =True)

print(df.to_string())

 

以上实例输出结果如下:

 

 3 Pandas 清洗重复数据

如果我们要清洗重复数据,可以使用duplicated()和drop_dulicates()方法

如果对应的数据是重复的,dulicated()会返回True,否则返回False

import pandas as pd

person = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]  

df = pd.DataFrame(person)

print(df.duplicated())

 

以上实例输出结果如下:

 

 删除重复数据,可以直接使用drop_dulicates()方法

import pandas as pd

person = {
  "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  "age": [50, 40, 40, 23]  

df = pd.DataFrame(person)

df.drop_duplicates(inplace = True)

print(df)

 

以上实例输出结果如下:

 

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...