Pandas 科学计算入门

Pandas 科学计算入门

Pandas 入门

基本操作

  • Pandas 基于 NumPy 开发,提供了大量快捷便利的数据处理方法,由 AQR Capital Management 于 2008 年开发,2009 年开源发布, 是支撑 Python 科学计算的强大工具
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd
import numpy as np
dates = pd.date_range("20200101", periods=6) # 生成6个数据
df = pd.DataFrame(np.random.rand(6, 4), index=dates, columns=['A', 'B', 'C', 'D'])
# 获取数据
print("获取df数据:\n{}".format(df))
# 观察数据
print("获取前两行数据:\n{}".format(df.head(2)))
print("获取后两行数据:\n{}".format(df.tail(2)))
# 查看属性和原始 ndarray
print("获取数据结构中的索引:\n{}".format(df.index))
print("获取维度基本属性:\n{}".format(df.shape))
print("获取数据结构中的实际数据:\n{}".format(df.values))
print("获取数据结构中A列的实际数据:\n{}".format(df[['A']].values))
# 描述统计量
print("描述统计量:\n{}".format(df.describe())) # 包含count, mean, max, min 等基础的统计信息

Pandas 数据结构

数据结构 维度 轴标签
Series 一维 index(唯一的轴)
DataFrame 二维 index(行)和columns(列)
Panel 三维 items、major_axis 和 minor_axis

Series

最基础的 Pandas 对象,它定义了 NumPy 的 ndarray 对象的接口 __arrat__(), 因此可以用 NumPy 的数组处理函数直接处理 Series 对象。

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
import numpy as np

data = [0, 1, 2]
index = ['a', 'b', 'c']
s = pd.Series(data, index=index)
s1 = pd.Series(data)
print("指定索引\n{}".format(s))
print("不指定索引\n{}".format(s1))
data1 = {'a': 1, 'b': 2, 'c': 3}
s2 = pd.Series(data=data1)
print("指定字典作为data\n{}".format(s2))

无索引时默认为0,1,2……

DataFrame

DataFrame 是表格型的数据结构,它含一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import pandas as pd

data = np.array([[1, 2, 3], [0, 1, 2]])
index = ['a', 'b']
columns = ["col1", "col2", "col3"]
df1 = pd.DataFrame(data, columns=columns, index=index)
print("df1=\n{}".format(df1))
df2 = pd.DataFrame(data)
print("无索引情况 DataFrame, df2=\n{}".format(df2))
data1 = {"Bob": ['M', 51, "worker", 7000], "Jane": ['F', 28, "manager", 10000], "Alice": ['F', 19, "student", 0]}
index = ["gender", "age", "profession", "incomes"]
df3 = pd.DataFrame(data=data1, index=index)
print("传入data为字典, df3=\n{}".format(df3))

没有指定索引时行列名为索引的数值,看着怪怪的

当然也可以读取本地数据文件来建立 Series 和 DataFrame

函数 说明
read_csv() 从 csv 格式的文本文件读取数据
read_execl() 从 Excel 文件读取数据
read_sql() 从 SQL 数据库的查询结果载入数据
read_pickle() 读入 pickle() 序列化后的数据

Pandas 数据的选取和清洗

用中括号[]选取行列

  • 可以使用单个标签如 ‘a’ 或者标签的列表或数组如 [‘a’, ‘b’, ‘c’]来索引
  • 具有标签’a’: ‘f’ 的切片对象,但与 Python 的 切片相反,包括开始和停止。
  • df['A'] 会返回 Series 对象,等效于 df.Adf[['A']] 返回的是 DataFrame

df.loc & df.iloc & df.ix 标签定位

  • 用逗号分隔开的左边的是行索引,右边的是列索引
  • ‘:’ 表示全部
  • loc 可以使用行列的索引(字母)来获取值而 iloc 使用的是整型的索引
  • ix 既可以使用字母来索引也可以用整型的索引

df.at & df.iat

  • 精确定位,使用方法如 df.at['a', 'A'], df.iat[0, 0]

数据清洗的基础操作

  • 我们获取的数据有些时候并不完整或者包含错误,这就需要我们批量的统一处理来便于我们的后续计算
data_clean.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(1, 10, [5, 3]), index=['a', 'c', 'e', 'f', 'h'], columns=["one", "two", "three"])
df.loc['a', "one"] = np.nan
df.loc['c', "two"] = -99
df.loc['c', "three"] = -99
df.loc['a', "two"] = -100
df["four"] = "bar"
df["five"] = df["one"] > 0
df2 = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print(df2)

# 丢弃缺失的值
print("删除缺失的值所在的行(axis=0)或列(axis=1)\n{}".format(df2.dropna(axis=0))) # axis=0为默认可以不指定
print("一行中全部为NaN才丢弃\n{}".format(df2.dropna(how='all')))

# 指定条件移除
print("移除所有字段中有属性小于4的行\n{}".format(df2.dropna(thresh=4)))
print("移除指定列为空的所在行的数据\n{}".format(df2.dropna(subset=["one", "five"])))

# 缺失值填充
print("缺失值用0填充\n{}".format(df2.fillna(0)))
print("指定列空值赋值\n{}".format(df2.fillna({"one": 0, "two": 1})))
print("向前填充值\n{}".format(df2.fillna(method="ffill"))) # 等效于 fill()
print("向后填充值\n{}".format(df2.fillna(method="backfill"))) # 等效于 bfill()
print("以列均值来替换\n{}".format(df2.fillna(df2.mean()["one": "three"]))) #从 one 到 three 用均值替代 nan

# 替换值
print("替换所有的行列的某个相同的值\n{}".format(df2.replace(-99, 99)))
print("指定单列替换\n{}".format(df2[["two"]].replace(-99, 99))) # 里面多一层[]是让返回 DataFrame 这样才可以调用其函数
df2[["two"]] = df2[["two"]].replace(-99, 99)
print("替换后\n{}".format(df2))
# 对重复值的处理
print("判断重复的值:只有每行所有列的值一样的时候返回True\n{}".format(df2.duplicated()))
print("针对'one'列除第一次出现外之后的进行判断\n{}".format(df2.duplicated("one", keep="first")))
print("针对'one'列除第一次出现外删除重复的\n{}".format(df2.drop_duplicates("one", keep="first")))
print("针对'one'列删除最后一次出现的重复项\n{}".format(df2.drop_duplicates("one", keep="last")))
print("针对'one'列删除全部的重复项\n{}".format(df2.drop_duplicates("one", keep=False)))
Author

Ctwo

Posted on

2020-01-26

Updated on

2020-10-25

Licensed under

Comments