2-工具与软件-2-Pandas

安装

在pycharm中对应的python解释器内安装pandas。

pandas的安装

1
2
3
import pandas

print(pandas.__version__)

Output:

1
2
3
2.1.0

进程已结束,退出代码0

Pandas 数据结构 - Series

Series 相当于表格中的一个列,函数如下:

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

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

也可以使用Map来创建Series:

1
2
3
4
5
6
7
import pandas as pd

sites = {1: "Google", 2: "Runoob", 3: "Wiki"}

myvar = pd.Series(sites)

print(myvar)

这样Key就变为了索引值。

Pandas 数据结构 - DataFrame

DataFrame 是一个表格型的数据结构,由一个index组成的第0列和DataFrame组成的n列构成,相当于Series组成的字典(共用一个index)。

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。

使用ndarrays创建DataFrame对象:

1
2
3
4
5
6
7
import pandas as pd

data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}

df = pd.DataFrame(data)

print (df)

Site Age为列名,0、1、2为行标。

使用Map创建与Series同理。

Pandas CSV 文件

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

df = pd.read_csv('nba.csv')读取CSV文件。

df.to_csv('site.csv')将DataFrame储存为csv文件。

数据处理

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

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

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

Pandas JSON 文件

Pandas 可以很方便的处理 JSON 数据

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

如果是字符串格式的 JSON 可以直接将Python字典转为DataFrame数据(json对象与Map有相同的格式)

Json数据的解析

直接加载一个print一个json文件打印出的并不直观。

1
2
3
4
5
          school_name   class                                           students
0 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() 方法将内嵌的数据完整的解析出来

1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import json

# 使用 Python JSON 模块载入数据
with open('nested_list.json','r') as f:
    data = json.loads(f.read())
#data = json.loads(f.read()) 使用 Python JSON 模块载入数据。

# 展平数据
df_nested_list = pd.json_normalize(data, record_path =['students'])
print(df_nested_list)

Output:

1
2
3
4
     id   name  math  physics  chemistry
0 A001 Tom 60 66 61
1 A002 James 89 76 51
2 A003 Jenny 79 90 78

读取一组数据glom

import pandas as pd
from glom import glom glom模块准许使用“.”来获取内嵌对象的属性

data = df['students'].apply(**lambda** row: glom(row, 'grade.math'))

效果类似于查找。

Pandas 数据清洗

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

例如数据中的“n/a NA – na”,或者空值等。

清洗空值: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()判断是否为空。

可以在read_csv()方法中指定空数据的数据类型:

1
2
3
4
import pandas as pd

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

dropna会返回一个新的Dataframe不会修改源数据。如果需要修改在inplace设置为True。

移除指定列有空值的行(移除 ST_NUM 列值为空)df.dropna(subset=['ST_NUM'], inplace = True)

我们也可以 fillna() 方法来替换一些空字段df.fillna(12345, inplace = True)

指定某一个列来替换数据df['PID'].fillna(12345, inplace = True)

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

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

比如mode() 方法计算列的众数并替换空单元格:

1
2
3
4
5
6
7
8
9
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())

清洗格式错误数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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())


#output:
Date duration
day1 2020-12-01 50
day2 2020-12-02 40
day3 2020-12-26 45

清洗错误数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import pandas as pd

person = {
  "name": ['Google', 'Runoob' , 'Taobao'],
  "age": [50, 40, 12345]    # 12345 年龄数据是错误的
}

df = pd.DataFrame(person)

df.loc[2, 'age'] = 30 # 修改数据 对错误的数据进行替换或移除。也可以使用if来判断if df.loc[x, "age"] > ?: df.drop(x, inplaced = True)

print(df.to_string())

#output:
name age
0 Google 50
1 Runoob 40
2 Taobao 30

清洗重复数据:

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

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

Pandas 常用函数

读取数据

函数 说明
pd.read_csv(filename) 读取 CSV 文件;
pd.read_excel(filename) 读取 Excel 文件;
pd.read_sql(query, connection_object) 从 SQL 数据库读取数据;
pd.read_json(json_string) 从 JSON 字符串中读取数据;
pd.read_html(url) 从 HTML 页面中读取数据。

查看数据

函数 说明
df.head(n) 显示前 n 行数据;
df.tail(n) 显示后 n 行数据;
df.info() 显示数据的信息,包括列名、数据类型、缺失值等;
df.describe() 显示数据的基本统计信息,包括均值、方差、最大值、最小值等;
df.shape 显示数据的行数和列数。

数据清洗

函数 说明
df.dropna() 删除包含缺失值的行或列;
df.fillna(value) 将缺失值替换为指定的值;
df.replace(old_value, new_value) 将指定值替换为新值;
df.duplicated() 检查是否有重复的数据;
df.drop_duplicates() 删除重复的数据。

数据选择和切片

函数 说明
df[column_name] 选择指定的列;
df.loc[row_index, column_name] 通过标签选择数据;
df.iloc[row_index, column_index] 通过位置选择数据;
df.ix[row_index, column_name] 通过标签或位置选择数据;
df.filter(items=[column_name1, column_name2]) 选择指定的列;
df.filter(regex=’regex’) 选择列名匹配正则表达式的列;
df.sample(n) 随机选择 n 行数据。

数据排序

函数 说明
df.sort_values(column_name) 按照指定列的值排序;
df.sort_values([column_name1, column_name2], ascending=[True, False]) 按照多个列的值排序;
df.sort_index() 按照索引排序。

数据分组和聚合

函数 说明
df.groupby(column_name) 按照指定列进行分组;
df.aggregate(function_name) 对分组后的数据进行聚合操作;
df.pivot_table(values, index, columns, aggfunc) 生成透视表。

数据合并

函数 说明
pd.concat([df1, df2]) 将多个数据框按照行或列进行合并;
pd.merge(df1, df2, on=column_name) 按照指定列将两个数据框进行合并。

数据选择和过滤

函数 说明
df.loc[row_indexer, column_indexer] 按标签选择行和列。
df.iloc[row_indexer, column_indexer] 按位置选择行和列。
df[df[‘column_name’] > value] 选择列中满足条件的行。
df.query(‘column_name > value’) 使用字符串表达式选择列中满足条件的行。

数据统计和描述

函数 说明
df.describe() 计算基本统计信息,如均值、标准差、最小值、最大值等。
df.mean() 计算每列的平均值。
df.median() 计算每列的中位数。
df.mode() 计算每列的众数。
df.count() 计算每列非缺失值的数量。

UPDATE TIME: 星期二 2023年9月19日