Pandas简介

Pandas 一个强大的分析结构化数据的工具集,基础是 NumPy(提供高性能的矩阵运算)。

Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。

Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。

Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。

Pandas 数据结构 - Series

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

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

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

参数说明:

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

实例

import pandas as pd
​
a = ["Google", "Runoob", "Wiki"]
​
myvar = pd.Series(a, index = ["x", "y", "z"])
​
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 是一个二维的数组结构,类似二维数组。

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

也可以返回多行数据,使用 [[ ... ]] 格式,... 为各行的索引,以逗号隔开

Pandas CSV 文件

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

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

import pandas as pd
​
df = pd.read_csv('nba.csv')
​
print(df)

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

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

head()

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

tail()

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

info()

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

Pandas JSON

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

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

内嵌的 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
  }]
}

这时我们就需要使用到 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  chemistry
0 A001   Tom   60       66         61
1 A002 James   89       76         51
2 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   class
0 A001   Tom   60       66         61 ABC primary school Year 1
1 A002 James   89       76         51 ABC primary school Year 1
2 A003 Jenny   79       90         78 ABC primary school Year 1

读取内嵌数据中的一组数据

以下是实例文件 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 模块允许我们使用 . 来访问内嵌对象的属性。

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    60
1   89
2   79
Name: students, dtype: int64

Pandas 数据清洗

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

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

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

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() 判断各个单元格是否为空。

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

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

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

Pandas 清洗格式错误数据

数据格式错误的单元格会使数据分析变得困难,甚至不可能。

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

Pandas 清洗错误数据

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

Pandas 清洗重复数据

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

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

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