Pandas
**Pandas 是 Python 语言的一个扩展程序库,用于数据分析。**Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
Pandas 的主要数据结构是 Series (一维数据)与 DataFrame(二维数据)。
Pandas 数据结构 - Series
Pandas Series 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。Series 由索引(index)和列组成,函数如下:
# SeriesData定义,索引默认从0开始。
myvar = pd.Series([[1,2],[3,4]])
print(myvar)
...0 [1, 2] # 索引 元素
...1 [3, 4]
...dtype: object
# 用索引访问某元素,注意series是一维数组,不能视为一个矩阵myvar[0,0]是不对的
print(myvar[0])
...[1, 2]
# 指定索引,虽然此时仍可用myvar[0]访问元素,但是当指定的索引为整数1,2,3,没有0时就会报错
myvar = pd.Series(["Google", "Runoob", "Wiki"], index = ["x", "y", "z"])
...x Google
...y Runoob
...z Wiki
...dtype: object
print(myvar['x'])
print(myvar[0])
Pandas 数据结构 - DataFrame
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
# dataFrame定义,行索引默认从0开始。data:二维数组,或一个平面矩阵。index:行索引。columns:列索引。
pandas.DataFrame( data, index, columns, dtype, copy)
# 输出所有列名
df.columns
# 形状
df.shape
# 利用list()
data = [['Google',10],['Runoob',12],['Wiki',13]]
df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)
print(df)
... Site Age
...0 Google 10.0
...1 Runoob 12.0
...2 Wiki 13.0
# 利用索引访问
print(df['site'])
...0 Google
...1 Runoob
...2 Wiki
...Name: Site, dtype: object
# 使用 n维数组ndarrays 创建
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)
print (df)
... Site Age
...0 Google 10
...1 Runoob 12
...2 Wiki 13
# 使用字典(key/value),其中字典的 key 为列名
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print (df)
... a b c
...0 1 2 NaN
...1 5 10 20.0
# 使用 loc 属性返回指定行的数据.返回结果其实就是一个 Pandas Series 数据。
data = {"calories": [420, 380, 390], "duration": [50, 40, 45]}
df = pd.DataFrame(data)
print(df.loc[0])
...calories 420
...duration 50
...Name: 0, dtype: int64
# 返回第一行和第二行.返回结果其实就是一个 Pandas DataFrame 数据。
print(df.loc[[0,1]])
print(df.loc[0:1])
... calories duration
...0 420 50
...1 380 40
# loc定位某列
df.loc['duration']
# loc定位某一个元素
df.loc[0,'duration']
# 对所有值进行运算
df['duration']/10
# 对对应位置分别计算,维度需相同
df['calories']*df['duration']
# 新加一列计算前两列的积
df['mul'] = df['calories']*df['duration']
# 数学函数
df['duration'].max()
# sort默认从小到大。inplace=True时新生成一个表,指定ascending为False时为降序
df.sort_values('duration',inplace = True,ascending=False)
Pandas CSV 文件
CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
# 读取csv文件,read_csv返回 DataFrame 类型的数据
df = pd.read_csv('nba.csv')
# 用 to_csv() 方法将 DataFrame 存储为 csv 文件:
df = pd.DataFrame(dict)
df.to_csv('site.csv')
# head( n ) 方法用于读取前面的 n 行,如果不填参数 n ,默认返回 5 行。
df.head()
# tail( n ) 方法用于读取尾部的 n 行,如果不填参数 n ,默认返回 5 行,空行各个字段的值返回 NaN。
df.tail()
# info() 方法返回表格的一些基本信息:
df.info()
# to_string()可打印全部信息到屏幕上
print(df.to_string())
Pandas JSON
JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。
# 读取json文件,返回 DataFrame 类型的数据,我们也可以直接处理 JSON 字符串。
df = pd.read_json('sites.json')
print(df.to_string())
... id likes name url
...0 A001 61 菜鸟教程 www.runoob.com
...1 A002 124 Google www.google.com
...2 A003 45 淘宝 www.taobao.com
# JSON 对象与 Python 字典具有相同的格式,所以我们可以直接将 Python 字典转化为 DataFrame 数据:
s = {
"col1":{"row1":1,"row2":2,"row3":3},
"col2":{"row1":"x","row2":"y","row3":"z"}
}
df = pd.DataFrame(s)
print(df)
# 从 URL 中读取 JSON 数据:
URL = 'https://static.runoob.com/download/sites.json'
df = pd.read_json(URL)
print(df)
# 内嵌的 JSON 数据文件 nested_list.json 以及更加复杂的json文件:详见菜鸟教程
数据清洗
数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。在这个教程中,我们将利用 Pandas包来进行数据清洗。
# Pandas 清洗空值
# 删除包含空字段的行
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
# 通过 isnull() 判断各个单元格是否为空。返回bool型dataFrame
df.isnull()
# 用na_values变量指定空值
missing_values = ["n/a", "na", "--"]
df = pd.read_csv('property-data.csv', na_values = missing_values)
print (df['NUM_BEDROOMS'].isnull())
# fillna() 方法来替换一些空字段:
df.fillna(12345, inplace = True)
# Pandas使用 mean()、median() 和 mode() 方法计算列的均值(所有值加起来的平均值)、中位数值(排序后排在中间的数)和众数(出现频率最高的数)。
x = df["ST_NUM"].mean()
x = df["ST_NUM"].median()
x = df["ST_NUM"].mode()
# Pandas 清洗错误数据
# 修改数据
df.loc[2, 'age'] = 30
for x in df.index:
if df.loc[x, "age"] > 120:
df.loc[x, "age"] = 120
# 删除数据(x这一整行)
for x in df.index:
if df.loc[x, "age"] > 120:
df.drop(x, inplace = True)
# Pandas 清洗重复数据
# 比较两行,dtype: bool的dataFrame,若两行一样,则后面的行为true
df.duplicated()
# 删除重复行
df.drop_duplicates(inplace = True)