安装

  1. pip install pandas

Series

定义

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

  • Series由索引(index)和列组成。

Series数据结构

  1. import pandas as pd
  2. pd.series(data, index, dtype, name, copy)
  3. 其中:
  4. * data:一组数据(ndarray类型);
  5. * index:数据索引标签,默认从0开始;
  6. * dtype:数据类型,默认程序自动判断;
  7. * name:设置名称;
  8. * copy:拷贝数据,默认为False

创建Series对象

创建空Series对象

  1. import pandas as pd
  2. pd.Series() # 空Series----一般编译器会报错

ndarray创建Series对象

  1. # 指定index
  2. import pandas as pd
  3. import numpy as np
  4. data = np.array(["a", "b", "c", "d", "e"])
  5. df = pd.Series(data, index=[1, 2, 3, 4, 5]) # 指定index
  6. print(df)

dict创建Series对象

  1. # 指定index
  2. import pandas as pd
  3. import numpy as np
  4. data = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
  5. df = pd.Series(data, index=["a", "d", "c", "b", "e"]) # 指定index,指定的index不在keys内,将填充NaN
  6. print(df)

标量创建Series对象

使用标量创建**Series**对象必须提供索引值

  1. import pandas as pd
  2. import numpy as np
  3. df = pd.Series(5, index=[1, 2, 3, 4, 5]) # 必须指定index
  4. print(df)

访问Series数据

位置索引访问

  1. import pandas as pd
  2. s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
  3. print(s[0]) # 位置下标
  4. print(s['a']) # 标签下标
  5. print(s[:3]) # 切片方式

索引标签访问

  1. import pandas as pd
  2. s = pd.Series([6, 7, 8, 9, 10], index=['a', 'b', 'c', 'd', 'e'])
  3. print(s['a']) # 访问单个元素
  4. print(s[['a', 'c', 'd']]) # 访问多个元素

DataFrame

定义

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值的类型。

  • DataFrame有行索引也有列索引,可以看作是**Series**组成的字典组成的(共用索引);
  • 本质是一个二维数组结构,类似于二维数组。

image.png
image.png

语法

  1. pandas.DataFrame(data, index, columns, dtype, copy)
  2. 其中:
  3. * data:一组数据(ndarraySeriesmaplistsdict等类型);
  4. * index:索引(行标签);
  5. * columns:列标签,默认从0开始;
  6. * dtype:数据类型;
  7. * copy:拷贝数据,默认为False

举例

  1. # 常规方式
  2. import pandas as pd
  3. data = [['Google',10],['Runoob',12],['Wiki',13]]
  4. df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)
  5. print(df)
  6. # ndarrays创建方式----键值对方式
  7. import pandas as pd
  8. data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
  9. df = pd.DataFrame(data)
  10. print (df)
  11. # 字典创建方式----键值对
  12. import pandas as pd
  13. data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}] # 没有对应的数据,自动填充为NaN
  14. df = pd.DataFrame(data)
  15. print (df)

输出结果如下:
image.png
image.png

Pandas loc属性

Pandas可以使用loc属性返回指定行的数据,如果不指定索引,默认从**0**开始

  1. df.loc(index:index, column:column)
  2. 其中:
  3. * index:index:行索引,两个index可单填或选填,如(index)或(index:)或(:index)或(:),不填写默认为包含全部;
  4. * column:column:两个column可选填,原理同上。
  1. import pandas as pd
  2. data = {
  3. "calories": [420, 380, 390],
  4. "duration": [50, 40, 45]
  5. }
  6. # 数据载入到 DataFrame 对象
  7. df = pd.DataFrame(data)
  8. # 返回第一行
  9. print(df.loc[0])
  10. # 返回多行(0~2行)数据
  11. print(df.loc[0:2])

CSV文件处理

to_string()

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

  1. import pandas as pd
  2. df = pd.read_csv('nba.csv')
  3. print(df.to_string())

to_csv()

to_csv()用于**DataFrame**类型数据存储为**csv**文件

  1. import pandas as pd
  2. # 三个字段 name, site, age
  3. nme = ["Google", "Runoob", "Taobao", "Wiki"]
  4. st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]
  5. ag = [90, 40, 80, 98]
  6. # 字典
  7. dict = {'name': nme, 'site': st, 'age': ag}
  8. df = pd.DataFrame(dict)
  9. # 保存 dataframe
  10. df.to_csv('site.csv')

数据处理

head()

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

  1. import pandas as pd
  2. df = pd.read_csv('nba.csv')
  3. print(df.head()) # 打印前5行数据
  4. print(df.head(10)) # 打印前10行数据

tail()

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

  1. import pandas as pd
  2. df = pd.read_csv('nba.csv')
  3. print(df.tail()) # 打印末尾5行
  4. print(df.tail(10)) # 打印末尾10行

info()

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

  1. import pandas as pd
  2. df = pd.read_csv('nba.csv')
  3. print(df.info())

JSON文件处理

to_string()

用于返回**DataFrame**类型的数据

  1. import pandas as pd
  2. df = pd.read_json('sites.json')
  3. print(df.to_string())

dict转换为DataFrame数据

**JSON**对象与Python字典具有相同的格式,可直接将Python字典转换为DataFrame数据

  1. import pandas as pd
  2. # 字典格式的 JSON
  3. s = {
  4. "col1":{"row1":1,"row2":2,"row3":3},
  5. "col2":{"row1":"x","row2":"y","row3":"z"}
  6. }
  7. # 读取 JSON 转为 DataFrame
  8. df = pd.DataFrame(s)
  9. print(df)

URL中读取JSON数据

  1. import pandas as pd
  2. URL = 'https://static.runoob.com/download/sites.json'
  3. df = pd.read_json(URL)
  4. print(df)

解析JSON文件(字典嵌字典或字典嵌数组的数据结构)

  1. # nested_mix.json文件
  2. {
  3. "school_name": "local primary school",
  4. "class": "Year 1",
  5. "info": {
  6. "president": "John Kasich",
  7. "address": "ABC road, London, UK",
  8. "contacts": {
  9. "email": "admin@e.com",
  10. "tel": "123456789"
  11. }
  12. },
  13. "students": [
  14. {
  15. "id": "A001",
  16. "name": "Tom",
  17. "math": 60,
  18. "physics": 66,
  19. "chemistry": 61
  20. },
  21. {
  22. "id": "A002",
  23. "name": "James",
  24. "math": 89,
  25. "physics": 76,
  26. "chemistry": 51
  27. },
  28. {
  29. "id": "A003",
  30. "name": "Jenny",
  31. "math": 79,
  32. "physics": 90,
  33. "chemistry": 78
  34. }]
  35. }
  1. """ 解析JSON程序 """
  2. # 1.loads()载入数据
  3. # 2.json_normalize()解析内嵌数据
  4. import pandas as pd
  5. import json #导入JSON模块
  6. # 使用 Python JSON 模块载入数据
  7. with open('nested_mix.json','r') as f:
  8. data = json.loads(f.read()) # 使用JSON模块载入数据
  9. # 展平数据
  10. df_nested_list = pd.json_normalize(
  11. data,
  12. record_path =['students'], # 使用参数record_path展开内嵌的JSON的记录students
  13. meta=[ # 使用参数meta显示其它需要显示的元数据
  14. 'class',
  15. ['info', 'president'], # 进入一级嵌套
  16. ['info', 'contacts', 'tel'] # 进入二级嵌套
  17. ]
  18. )
  19. print(df_nested_list)

glom模块解析属性(字典嵌字典再嵌数组的数据结构)

glom模块允许使用**.**来访问内嵌对象的属性

  1. # nested_deep.json 文件
  2. {
  3. "school_name": "local primary school",
  4. "class": "Year 1",
  5. "students": [
  6. {
  7. "id": "A001",
  8. "name": "Tom",
  9. "grade": {
  10. "math": 60,
  11. "physics": 66,
  12. "chemistry": 61
  13. }
  14. },
  15. {
  16. "id": "A002",
  17. "name": "James",
  18. "grade": {
  19. "math": 89,
  20. "physics": 76,
  21. "chemistry": 51
  22. }
  23. },
  24. {
  25. "id": "A003",
  26. "name": "Jenny",
  27. "grade": {
  28. "math": 79,
  29. "physics": 90,
  30. "chemistry": 78
  31. }
  32. }]
  33. }
  1. # 实现单独显示math字段
  2. import pandas as pd
  3. from glom import glom
  4. df = pd.read_json('nested_deep.json')
  5. data = df['students'].apply(lambda row: glom(row, 'grade.math'))
  6. print(data)

数据清洗

清洗空值

dropna()方法

dropna()用于删除包含空字段的行

  1. DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
  2. 其中:
  3. * axis:默认为0,表示逢空值删除整行;如果axis=1,表示逢空值删除整列;
  4. * how:默认为'any',表示如果一行或一列中,任意一个数据有出息NA,就删除该行;
  5. 如果how='all',表示一行或一列中,所有数据都是NA才可删除整行。
  6. * thresh:设置需要多少个非空值的数据才可保留下来;
  7. * subset:设置想要检查的列,如果是多个列,可以使用列名的list作为参数;
  8. * inplace:默认False,如果设置为True,表示新计算结果将覆盖源数据,并返回None
  1. # 示例:删除指定列的空数据
  2. import pandas as pd
  3. df = pd.read_csv('property-data.csv')
  4. df.dropna(subset=['ST_NUM'], inplace = True)
  5. print(df.to_string())

isnull()方法

isnull()用于判断单元格是否为空

  1. import pandas as pd
  2. df = pd.read_csv('property-data.csv')
  3. print (df['NUM_BEDROOMS'])
  4. print (df['NUM_BEDROOMS'].isnull())

指定空数据类型

由于isnull()方法无法识别na--等类型为空数据,可通过na_vulues参数添加指定类型。

  1. import pandas as pd
  2. missing_values = ["n/a", "na", "--"] # 添加指定空数据类型
  3. df = pd.read_csv('property-data.csv', na_values = missing_values)
  4. print (df['NUM_BEDROOMS'])
  5. print (df['NUM_BEDROOMS'].isnull())

fillna()方法

fillna()用于替换数据中的空字段

  1. # 示例1:常规替换空字段
  2. import pandas as pd
  3. df = pd.read_csv('property-data.csv')
  4. df.fillna(12345, inplace = True)
  5. print(df.to_string())
  6. # 示例2:替换指定列的空字段
  7. import pandas as pd
  8. df = pd.read_csv('property-data.csv')
  9. df['PID'].fillna(12345, inplace = True)
  10. print(df.to_string())

替换空单元格的常用方法

替换空单元格的常用方法是计算列的均值(mean())、中位数(排序后的中间数值,median())或众数(出现频率最高的数值,mode())。

  1. import pandas as pd
  2. df = pd.read_csv('property-data.csv')
  3. x = df["ST_NUM"].mean() # 计算均值
  4. df["ST_NUM"].fillna(x, inplace = True) # 空值填充均值
  5. print(df.to_string())

清洗格式错误数据

通过包含空单元格的行,或将列中的所有单元格转换成相同格式的数据

  1. import pandas as pd
  2. # 第三个日期格式错误
  3. data = {
  4. "Date": ['2020/12/01', '2020/12/02' , '20201226'],
  5. "duration": [50, 40, 45]
  6. }
  7. df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
  8. df['Date'] = pd.to_datetime(df['Date']) # 格式化日期
  9. print(df.to_string())

清洗错误数据

可以对错误的数据进行替换移除

  1. import pandas as pd
  2. person = {
  3. "name": ['Google', 'Runoob' , 'Taobao'],
  4. "age": [50, 40, 12345] # 12345 年龄数据是错误的
  5. }
  6. df = pd.DataFrame(person)
  7. df.loc[2, 'age'] = 30 # 修改数据--第2行,age列
  8. print(df.to_string())

清洗重复数据

duplicated()检测数据是否重复

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

  1. import pandas as pd
  2. person = {
  3. "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  4. "age": [50, 40, 40, 23]
  5. }
  6. df = pd.DataFrame(person)
  7. print(df.duplicated())

drop_duplicates()删除重复数据

  1. import pandas as pd
  2. persons = {
  3. "name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
  4. "age": [50, 40, 40, 23]
  5. }
  6. df = pd.DataFrame(persons)
  7. df.drop_duplicates(inplace = True)
  8. print(df)