Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。

Pandas 名字衍生自术语 “panel data”(面板数据)和 “Python data analysis”(Python 数据分析)。
Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。

学习本教程前你需要了解 在开学习 Pandas 教程之前,我们需要具备基本的 Python 基础,如果你对
Python还不了解,可以阅读我们的教程:

Python 2.x 版本
Python 3.x 版本
Pandas 应用
Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。

数据结构
Series 是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。

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

Pandas安装安装
pandas需要基础环境是Python,开始前我们假定你已经安装了Python和Pip。

使用pip安装pandas:

Microsoft Windows [版本 10.0.19043.1645]
© Microsoft Corporation。保留所有权利。

C:\WINDOWS\system32>pip install pandas
Requirement already satisfied: pandas in c:\users\1234\anaconda3\lib\site-packages (1.3.4)
Requirement already satisfied: pytz>=2017.3 in c:\users\1234\anaconda3\lib\site-packages (from pandas) (2021.3)
Requirement already satisfied: numpy>=1.17.3 in c:\users\1234\anaconda3\lib\site-packages (from pandas) (1.20.3)
Requirement already satisfied: python-dateutil>=2.7.3 in c:\users\1234\anaconda3\lib\site-packages (from pandas) (2.8.2)
Requirement already satisfied: six>=1.5 in c:\users\1234\anaconda3\lib\site-packages (from python-dateutil>=2.7.3->pandas) (1.16.0)

C:\WINDOWS\system32>
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 可以参考:NumPy Ndarray 对象

实例 - 使用 ndarrays 创建
import pandas as pd

data = {‘Site’:[‘Google’, ‘Runoob’, ‘Wiki’], ‘Age’:[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)
输出结果为:

a b c0 1 2 NaN1 5 10 20.0
没有对应的部分数据为 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])
输出结果如下:

calories 420
duration 50Name: 0, dtype: int64
calories 380
duration 40Name: 1, dtype: int64
注意:返回结果其实就是一个 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]])
输出结果为:

calories duration0 420 501 380 40
注意:返回结果其实就是一个 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)
输出结果为:

calories duration
day1 420 50
day2 380 40
day3 390 45
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”])
输出结果为:

calories 380
duration 40Name: day2, dtype: int64
Pandas CSV 文件
CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

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

Pandas 可以很方便的处理 CSV 文件,本文以 nba.csv 为例,你可以下载 nba.csv 或打开 nba.csv 查看。

实例
import pandas as pd

df = pd.read_csv(‘nba.csv’)

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

实例
import pandas as pd

df = pd.read_csv(‘nba.csv’)

print(df)
输出结果为:

   Name            Team  Number Position   Age Height  Weight            College     Salary0    Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas  7730337.01      Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette  6796117.02     John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University        NaN3      R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State  1148640.04    Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0                NaN  5000000.0..             ...             ...     ...      ...   ...    ...     ...                ...        ...453   Shelvin Mack       Utah Jazz     8.0       PG  26.0    6-3   203.0             Butler  2433333.0454      Raul Neto       Utah Jazz    25.0       PG  24.0    6-1   179.0                NaN   900000.0455   Tibor Pleiss       Utah Jazz    21.0        C  26.0    7-3   256.0                NaN  2900000.0456    Jeff Withey       Utah Jazz    24.0        C  26.0    7-0   231.0             Kansas   947276.0457            NaN             NaN     NaN      NaN   NaN    NaN     NaN                NaN        NaN

我们也可以使用 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 文件,显示结果如下:

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

实例 - 读取前面 5 行
import pandas as pd

df = pd.read_csv(‘nba.csv’)

print(df.head())
输出结果为:

        Name            Team  Number Position   Age Height  Weight            College     Salary0  Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas  7730337.01    Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette  6796117.02   John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University        NaN3    R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State  1148640.04  Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0                NaN  5000000.0

实例 - 读取前面 10 行
import pandas as pd

df = pd.read_csv(‘nba.csv’)

print(df.head(10))
输出结果为:

        Name            Team  Number Position   Age Height  Weight            College      Salary0  Avery Bradley  Boston Celtics     0.0       PG  25.0    6-2   180.0              Texas   7730337.01    Jae Crowder  Boston Celtics    99.0       SF  25.0    6-6   235.0          Marquette   6796117.02   John Holland  Boston Celtics    30.0       SG  27.0    6-5   205.0  Boston University         NaN3    R.J. Hunter  Boston Celtics    28.0       SG  22.0    6-5   185.0      Georgia State   1148640.04  Jonas Jerebko  Boston Celtics     8.0       PF  29.0   6-10   231.0                NaN   5000000.05   Amir Johnson  Boston Celtics    90.0       PF  29.0    6-9   240.0                NaN  12000000.06  Jordan Mickey  Boston Celtics    55.0       PF  21.0    6-8   235.0                LSU   1170960.07   Kelly Olynyk  Boston Celtics    41.0        C  25.0    7-0   238.0            Gonzaga   2165160.08   Terry Rozier  Boston Celtics    12.0       PG  22.0    6-2   190.0         Louisville   1824360.09   Marcus Smart  Boston Celtics    36.0       PG  22.0    6-4   220.0     Oklahoma State   3431040.0

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

实例 - 读取末尾 5 行
import pandas as pd

df = pd.read_csv(‘nba.csv’)

print(df.tail())
输出结果为:

         Name       Team  Number Position   Age Height  Weight College     Salary453  Shelvin Mack  Utah Jazz     8.0       PG  26.0    6-3   203.0  Butler  2433333.0454     Raul Neto  Utah Jazz    25.0       PG  24.0    6-1   179.0     NaN   900000.0455  Tibor Pleiss  Utah Jazz    21.0        C  26.0    7-3   256.0     NaN  2900000.0456   Jeff Withey  Utah Jazz    24.0        C  26.0    7-0   231.0  Kansas   947276.0457           NaN        NaN     NaN      NaN   NaN    NaN     NaN     NaN        NaN

实例 - 读取末尾 10 行
import pandas as pd

df = pd.read_csv(‘nba.csv’)

print(df.tail(10))
输出结果为:

           Name       Team  Number Position   Age Height  Weight   College      Salary448  Gordon Hayward  Utah Jazz    20.0       SF  26.0    6-8   226.0    Butler  15409570.0449     Rodney Hood  Utah Jazz     5.0       SG  23.0    6-8   206.0      Duke   1348440.0450      Joe Ingles  Utah Jazz     2.0       SF  28.0    6-8   226.0       NaN   2050000.0451   Chris Johnson  Utah Jazz    23.0       SF  26.0    6-6   206.0    Dayton    981348.0452      Trey Lyles  Utah Jazz    41.0       PF  20.0   6-10   234.0  Kentucky   2239800.0453    Shelvin Mack  Utah Jazz     8.0       PG  26.0    6-3   203.0    Butler   2433333.0454       Raul Neto  Utah Jazz    25.0       PG  24.0    6-1   179.0       NaN    900000.0455    Tibor Pleiss  Utah Jazz    21.0        C  26.0    7-3   256.0       NaN   2900000.0456     Jeff Withey  Utah Jazz    24.0        C  26.0    7-0   231.0    Kansas    947276.0457             NaN        NaN     NaN      NaN   NaN    NaN     NaN       NaN         NaN

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

实例
import pandas as pd

df = pd.read_csv(‘nba.csv’)

print(df.info())
输出结果为:

<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 458 entries, 0 to 457 # 行数,458 行,第一行编号为 0
Data columns (total 9 columns): # 列数,9列

Column Non-Null Count Dtype # 各列的数据类型


0 Name 457 non-null object
1 Team 457 non-null object
2 Number 457 non-null float64
3 Position 457 non-null object
4 Age 457 non-null float64
5 Height 457 non-null object
6 Weight 457 non-null float64
7 College 373 non-null object # non-null,意思为非空的数据
8 Salary 446 non-null float64
dtypes: float64(4), object(5) # 类型
non-null 为非空数据,我们可以看到上面的信息中,总共 458 行,College 字段的空值最多。

Pandas JSON
JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。

JSON 比 XML 更小、更快,更易解析,更多 JSON 内容可以参考 JSON 教程。

Pandas 可以很方便的处理 JSON 数据,本文以 sites.json 为例,内容如下:

实例
[ { “id”: “A001”, “name”: “菜鸟教程”, “url”: “www.runoob.com”, “likes”: 61 },
{ “id”: “A002”, “name”: “Google”, “url”: “www.google.com”, “likes”: 124 },
{ “id”: “A003”, “name”: “淘宝”, “url”: “www.taobao.com”, “likes”: 45 } ]
实例
import pandas as pd

df = pd.read_json(‘sites.json’)

print(df.to_string())
to_string() 用于返回 DataFrame 类型的数据,我们也可以直接处理 JSON 字符串。

实例
import pandas as pd

data =[
{
“id”: “A001”,
“name”: “菜鸟教程”,
“url”: “www.runoob.com”,
“likes”: 61
},
{
“id”: “A002”,
“name”: “Google”,
“url”: “www.google.com”,
“likes”: 124
},
{
“id”: “A003”,
“name”: “淘宝”,
“url”: “www.taobao.com”,
“likes”: 45
}
]
df = pd.DataFrame(data)

print(df)
以上实例输出结果为:

 id    name             url  likes0  A001    菜鸟教程  www.runoob.com     611  A002  Google  www.google.com    1242  A003      淘宝  www.taobao.com     45

JSON 对象与 Python 字典具有相同的格式,所以我们可以直接将 Python 字典转化为 DataFrame 数据:

实例
import pandas as pd

字典格式的 JSON

s = {
“col1”:{“row1”:1,“row2”:2,“row3”:3},
“col2”:{“row1”:“x”,“row2”:“y”,“row3”:“z”}
}

读取 JSON 转为 DataFrame

df = pd.DataFrame(s)
print(df)
以上实例输出结果为:

  col1 col2

row1 1 x
row2 2 y
row3 3 z
从 URL 中读取 JSON 数据:

实例
import pandas as pd

URL = ‘https://static.runoob.com/download/sites.json’
df = pd.read_json(URL)
print(df)
以上实例输出结果为:

 id    name             url  likes0  A001    菜鸟教程  www.runoob.com     611  A002  Google  www.google.com    1242  A003      淘宝  www.taobao.com     45

内嵌的 JSON 数据
假设有一组内嵌的 JSON 数据文件 nested_list.json :

nested_list.json 文件内容
{
“school_name”: “ABC primary school”,
“class”: “Year 1”,
“students”: [
{
“id”: “A001”,
“name”: “Tom”,
“math”: 60,
“physics”: 66,
“chemistry”: 61
},
{
“id”: “A002”,
“name”: “James”,
“math”: 89,
“physics”: 76,
“chemistry”: 51
},
{
“id”: “A003”,
“name”: “Jenny”,
“math”: 79,
“physics”: 90,
“chemistry”: 78
}]
}
使用以下代码格式化完整内容:

实例
import pandas as pd

df = pd.read_json(‘nested_list.json’)

print(df)
以上实例输出结果为:

      school_name   class                                           students0  ABC primary school  Year 1  {'id': 'A001', 'name': 'Tom', 'math': 60, 'phy...

1 ABC primary school Year 1 {‘id’: ‘A002’, ‘name’: ‘James’, ‘math’: 89, 'p…2 ABC primary school Year 1 {‘id’: ‘A003’, ‘name’: ‘Jenny’, ‘math’: 79, 'p…
这时我们就需要使用到 json_normalize() 方法将内嵌的数据完整的解析出来:

实例
import pandas as pd
import json

使用 Python JSON 模块载入数据

with open(‘nested_list.json’,‘r’) as f:
data = json.loads(f.read())

展平数据

df_nested_list = pd.json_normalize(data, record_path =[‘students’])
print(df_nested_list)
以上实例输出结果为:

 id   name  math  physics  chemistry0  A001    Tom    60       66         611  A002  James    89       76         512  A003  Jenny    79       90         78

data = json.loads(f.read()) 使用 Python JSON 模块载入数据。

json_normalize() 使用了参数 record_path 并设置为 [‘students’] 用于展开内嵌的 JSON 数据 students。

显示结果还没有包含 school_name 和 class 元素,如果需要展示出来可以使用 meta 参数来显示这些元数据:

实例
import pandas as pd
import json

使用 Python JSON 模块载入数据

with open(‘nested_list.json’,‘r’) as f:
data = json.loads(f.read())

展平数据

df_nested_list = pd.json_normalize(
data,
record_path =[‘students’],
meta=[‘school_name’, ‘class’]
)
print(df_nested_list)
以上实例输出结果为:

 id   name  math  physics  chemistry         school_name   class0  A001    Tom    60       66         61  ABC primary school  Year 11  A002  James    89       76         51  ABC primary school  Year 12  A003  Jenny    79       90         78  ABC primary school  Year 1

接下来,让我们尝试读取更复杂的 JSON 数据,该数据嵌套了列表和字典,数据文件 nested_mix.json 如下:

nested_mix.json 文件内容
{
“school_name”: “local primary school”,
“class”: “Year 1”,
“info”: {
“president”: “John Kasich”,
“address”: “ABC road, London, UK”,
“contacts”: {
“email”: “admin@e.com”,
“tel”: “123456789”
}
},
“students”: [
{
“id”: “A001”,
“name”: “Tom”,
“math”: 60,
“physics”: 66,
“chemistry”: 61
},
{
“id”: “A002”,
“name”: “James”,
“math”: 89,
“physics”: 76,
“chemistry”: 51
},
{
“id”: “A003”,
“name”: “Jenny”,
“math”: 79,
“physics”: 90,
“chemistry”: 78
}]
}
nested_mix.json 文件转换为 DataFrame:

实例
import pandas as pd
import json

使用 Python JSON 模块载入数据

with open(‘nested_mix.json’,‘r’) as f:
data = json.loads(f.read())

df = pd.json_normalize(
data,
record_path =[‘students’],
meta=[
‘class’,
[‘info’, ‘president’],
[‘info’, ‘contacts’, ‘tel’]
]
)

print(df)
以上实例输出结果为:

 id   name  math  physics  chemistry   class info.president info.contacts.tel0  A001    Tom    60       66         61  Year 1    John Kasich         1234567891  A002  James    89       76         51  Year 1    John Kasich         1234567892  A003  Jenny    79       90         78  Year 1    John Kasich         123456789

读取内嵌数据中的一组数据
以下是实例文件 nested_deep.json,我们只读取内嵌中的 math 字段:

nested_deep.json 文件内容
{
“school_name”: “local primary school”,
“class”: “Year 1”,
“students”: [
{
“id”: “A001”,
“name”: “Tom”,
“grade”: {
“math”: 60,
“physics”: 66,
“chemistry”: 61
}

},
{"id": "A002","name": "James","grade": {"math": 89,"physics": 76,"chemistry": 51}},
{"id": "A003","name": "Jenny","grade": {"math": 79,"physics": 90,"chemistry": 78}
}]

}
这里我们需要使用到 glom 模块来处理数据套嵌,glom 模块允许我们使用 . 来访问内嵌对象的属性。

第一次使用我们需要安装 glom:

crosoft Windows [版本 10.0.19043.1645]
© Microsoft Corporation。保留所有权利。

C:\WINDOWS\system32>pip3 install glom
Collecting glom
Downloading glom-22.1.0-py2.py3-none-any.whl (100 kB)
---------------------------------------- 100.7/100.7 KB 207.0 kB/s eta 0:00:00
Requirement already satisfied: attrs in c:\users\1234\anaconda3\lib\site-packages (from glom) (21.2.0)
Collecting face>=20.1.0
Downloading face-20.1.1.tar.gz (46 kB)
---------------------------------------- 46.1/46.1 KB 65.5 kB/s eta 0:00:00
Preparing metadata (setup.py) … done
Collecting boltons>=19.3.0
Downloading boltons-21.0.0-py2.py3-none-any.whl (193 kB)
---------------------------------------- 193.7/193.7 KB 22.4 kB/s eta 0:00:00
Building wheels for collected packages: face
Building wheel for face (setup.py) … done
Created wheel for face: filename=face-20.1.1-py3-none-any.whl size=51091 sha256=99e01f53c847c9dc424b78c7ec2db5000ccdac9315443dd34ab6be497b5d39e1
Stored in directory: c:\users\1234\appdata\local\pip\cache\wheels\0b\80\b2\3c1246291c89bce05b70c927e249dac03252caaaa5dcd9d07e
Successfully built face
Installing collected packages: boltons, face, glom
Successfully installed boltons-21.0.0 face-20.1.1 glom-22.1.0

C:\WINDOWS\system32>
实例
import pandas as pd
from glom import glom

df = pd.read_json(‘nested_deep.json’)

data = df[‘students’].apply(lambda row: glom(row, ‘grade.math’))
print(data)
以上实例输出结果为:

0 601 892 79Name: students, dtype: int64
Pandas 数据清洗
数据清洗是对一些没有用的数据进行处理的过程。

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

在这个教程中,我们将利用 Pandas包来进行数据清洗。

本文使用到的测试数据 property-data.csv 如下:

上表包含来四种空数据:

n/a
NA

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

DataFrame.dropna(axis=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 = pd.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 = pd.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())
以上实例输出结果如下:

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

实例
移除 ST_NUM 列中字段值为空的行:

import pandas as pd

df = pd.read_csv(‘property-data.csv’)

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

print(df.to_string())
以上实例输出结果如下:

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

实例
使用 12345 替换空字段:

import pandas as pd

df = pd.read_csv(‘property-data.csv’)

df.fillna(12345, inplace = True)

print(df.to_string())
以上实例输出结果如下:

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

实例
使用 12345 替换 PID 为空数据:

import pandas as pd

df = pd.read_csv(‘property-data.csv’)

df[‘PID’].fillna(12345, inplace = True)

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()

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

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

实例

使用 median() 方法计算列的中位数并替换空单元格:

import pandas as pd

df = pd.read_csv(‘property-data.csv’)

x = df[“ST_NUM”].median()

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

print(df.to_string())
以上实例输出结果如下,红框为计算的中位数替换来空单元格:

实例
使用 mode() 方法计算列的众数并替换空单元格:

import pandas as pd

df = pd.read_csv(‘property-data.csv’)

x = df[“ST_NUM”].mode()

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

print(df.to_string())

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

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())
数据格式错误的单元格会使数据分析变得困难,甚至不可能。

我们可以通过包含空单元格的行,或者将列中的所有单元格转换为相同格式的数据。

以下实例会格式化日期:

实例
以上实例输出结果如下:

       Date  duration

day1 2020-12-01 50
day2 2020-12-02 40
day3 2020-12-26 45
Pandas 清洗错误数据
数据错误也是很常见的情况,我们可以对错误的数据进行替换或移除。

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

实例
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())
以上实例输出结果如下:

 name  age0  Google   501  Runoob   402  Taobao   30

也可以设置条件语句:

实例
将 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())
以上实例输出结果如下:

 name  age0  Google   501  Runoob  1202  Taobao  120

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

实例
将 age 大于 120 的删除:

import pandas as pd

person = {
“name”: [‘Google’, ‘Runoob’ , ‘Taobao’],
“age”: [50, 40, 12345] # 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())
以上实例输出结果如下:

 name  age0  Google   501  Runoob   40

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

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

实例
import pandas as pd

person = {
“name”: [‘Google’, ‘Runoob’, ‘Runoob’, ‘Taobao’],
“age”: [50, 40, 40, 23]
}
df = pd.DataFrame(person)

print(df.duplicated())
以上实例输出结果如下:

0 False1 False2 True3 False
dtype: bool
删除重复数据,可以直接使用drop_duplicates() 方法。

实例
import pandas as pd

persons = {
“name”: [‘Google’, ‘Runoob’, ‘Runoob’, ‘Taobao’],
“age”: [50, 40, 40, 23]
}

df = pd.DataFrame(persons)

df.drop_duplicates(inplace = True)
print(df)
以上实例输出结果如下:

 name  age0  Google   501  Runoob   403  Taobao   23

网络爬虫pandas相关推荐

  1. pandas网络爬虫(一)

    说到网络爬虫,就要提到正则表达式和urllib库 python自带re模块和urllib模块 ----------------------------------------------------- ...

  2. Python网络爬虫实战:天猫胸罩销售数据分析

    本文实现一个非常有趣的项目,这个项目是关于胸罩销售数据分析的.是网络爬虫和数据分析的综合应用项目.本项目会从天猫抓取胸罩销售数据,并将这些数据保存到SQLite数据库中,然后对数据进行清洗,最后通过S ...

  3. python与excel结合能做什么-Python网络爬虫与文本数据分析

    原标题:Python网络爬虫与文本数据分析 课程介绍 在过去的两年间,Python一路高歌猛进,成功窜上"最火编程语言"的宝座.惊奇的是使用Python最多的人群其实不是程序员,而 ...

  4. python爬虫从入门到精通-Python网络爬虫开发从入门到精通

    本书共分 3 篇,针对 Python 爬虫初学者,从零开始,系统地讲解了如何利用 Python 进行常见的网络爬虫的程序开发. 第 1 篇快速入门篇(第 1 章 ~ 第 9 章):本篇主要介绍了 Py ...

  5. 如何自学python爬虫-Python初学者如何从网络爬虫到机器学习?

    很多同学选择了Python作为其学习编程的首选语言,而Python也以其容易上手的语法.广泛的应用领域.不断旺盛的市场需求回报着每一个学习者和应用者. 今天我们来说说Python的一个热门的应用领域- ...

  6. python爬虫与数据分析实战27_Python网络爬虫与文本数据分析

    原标题:Python网络爬虫与文本数据分析 课程介绍 在过去的两年间,Python一路高歌猛进,成功窜上"最火编程语言"的宝座.惊奇的是使用Python最多的人群其实不是程序员,而 ...

  7. 这可能是你见过的最全的网络爬虫总结

    前段时间参加了一场 Python 网络爬虫主题的分享活动,主要以直播的形式分享了我从事网络爬虫相关研究以来的一些经验总结.整个分享分为三个阶段,第一阶段先介绍了自己从大学以来从事编程开发以来的相关历程 ...

  8. 干货下载:可能是你见过的最全的网络爬虫总结

    昨天的时候我参加了一场 Python 网络爬虫主题的分享活动,主要以直播的形式分享了我从事网络爬虫相关研究以来的一些经验总结,整个直播从昨天下午 1 点一直持续到下午 5 点,整整四个小时. 整个分享 ...

  9. 爬虫获取不到网页完整源码_你的第一只网络爬虫

    " 我相信有相当大部分人,学习python最初动机,就是做一个网络爬虫,虽然python的主要强项是数据分析方面(至少我是这样认为的),但这并不妨碍它成为目前最主流的网络爬虫编写语言.&qu ...

  10. 基于Python的网络爬虫爬取天气数据可视化分析

    目录 摘 要 1 一. 设计目的 2 二. 设计任务内容 3 三. 常用爬虫框架比较 3 四.网络爬虫程序总体设计 3 四. 网络爬虫程序详细设计 4 4.1设计环境和目标分析 4 4.2爬虫运行流程 ...

最新文章

  1. 微软职位内部推荐-Senior Software Engineer-Eco
  2. AI一分钟 | 教育部公布高中新课标,编程、算法思维成必修内容;李彦宏否认百度会“All in AI”
  3. android代码说明文档,android:label说明
  4. 关于ubuntu系统无线网络网速慢的解决方法
  5. Hyperledger Fabric 智能合约实战 (3) 安装fabric
  6. codeblocks c++ 编译出错
  7. Python 中的Pandas库
  8. HDU 5025Saving Tang Monk BFS + 二进制枚举状态
  9. cordova 5.0版本说明
  10. 【专栏必读】(计算机组成原理题目题型总结)计理期末考试408统考算机组成原必考题型总结
  11. Angular Extends
  12. [bzoj 2017] [Usaco2009 Nov]硬币游戏
  13. 新鲜出炉的2012年8月桌面日历壁纸免费下载
  14. vue多级菜单的实现
  15. 为了相同的前缀-麦迪时刻
  16. [GZOI2019GXOI2019]省选AFO记
  17. 房屋水电煤气省钱秘籍
  18. 信号发送,槽函数执行,过程中传递的是对象的引用,涉及的拷贝操作
  19. 英文论文写作注意事项整理
  20. 九连环解法java版

热门文章

  1. 安装虚拟机后无法获取 vmci 驱动程序版本句柄无效解决方法!
  2. 【手工儿童】}DIY冬南瓜小兔子
  3. 五线谱音名和组别对照表_五线谱上区别各个音的组别
  4. camille mumu 模拟器 frida 踩坑记录
  5. python如何设置清华镜像源
  6. 数据中心加湿系统计算及方法探讨【新规范加湿方式对比及计算分析】
  7. H3C S5820V2 MSR36-20
  8. winserver2003打开ping
  9. 用python祝节日快乐_节日快乐祝福语有哪些?
  10. 2019年,北上广等一线城市的IT岗位饱和了么?