安装
pip install pandas
Series
定义
Paddas Series类似表格中的一个列(column),属于一维数组,可以保存任意数据类型。
Series由索引(index)和列组成。

import pandas as pdpd.series(data, index, dtype, name, copy)其中:* data:一组数据(ndarray类型);* index:数据索引标签,默认从0开始;* dtype:数据类型,默认程序自动判断;* name:设置名称;* copy:拷贝数据,默认为False。
创建Series对象
创建空Series对象
import pandas as pdpd.Series() # 空Series----一般编译器会报错
ndarray创建Series对象
# 指定indeximport pandas as pdimport numpy as npdata = np.array(["a", "b", "c", "d", "e"])df = pd.Series(data, index=[1, 2, 3, 4, 5]) # 指定indexprint(df)
dict创建Series对象
# 指定indeximport pandas as pdimport numpy as npdata = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}df = pd.Series(data, index=["a", "d", "c", "b", "e"]) # 指定index,指定的index不在keys内,将填充NaNprint(df)
标量创建Series对象
使用标量创建**Series**对象,必须提供索引值。
import pandas as pdimport numpy as npdf = pd.Series(5, index=[1, 2, 3, 4, 5]) # 必须指定indexprint(df)
访问Series数据
位置索引访问
import pandas as pds = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])print(s[0]) # 位置下标print(s['a']) # 标签下标print(s[:3]) # 切片方式
索引标签访问
import pandas as pds = pd.Series([6, 7, 8, 9, 10], index=['a', 'b', 'c', 'd', 'e'])print(s['a']) # 访问单个元素print(s[['a', 'c', 'd']]) # 访问多个元素
DataFrame
定义
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值的类型。
DataFrame既有行索引也有列索引,可以看作是由**Series**组成的字典组成的(共用索引);- 本质是一个二维数组结构,类似于二维数组。
语法
pandas.DataFrame(data, index, columns, dtype, copy)其中:* data:一组数据(ndarray、Series、map、lists、dict等类型);* index:索引(行标签);* columns:列标签,默认从0开始;* dtype:数据类型;* copy:拷贝数据,默认为False。
举例
# 常规方式import pandas as pddata = [['Google',10],['Runoob',12],['Wiki',13]]df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)print(df)# ndarrays创建方式----键值对方式import pandas as pddata = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}df = pd.DataFrame(data)print (df)# 字典创建方式----键值对import pandas as pddata = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}] # 没有对应的数据,自动填充为NaNdf = pd.DataFrame(data)print (df)
Pandas loc属性
Pandas可以使用loc属性返回指定行的数据,如果不指定索引,默认从**0**开始。
df.loc(index:index, column:column)其中:* index:index:行索引,两个index可单填或选填,如(index)或(index:)或(:index)或(:),不填写默认为包含全部;* column:column:两个column可选填,原理同上。
import pandas as pddata = {"calories": [420, 380, 390],"duration": [50, 40, 45]}# 数据载入到 DataFrame 对象df = pd.DataFrame(data)# 返回第一行print(df.loc[0])# 返回多行(0~2行)数据print(df.loc[0:2])
CSV文件处理
to_string()
to_string()用于返回**DataFrame**类型的数据,如果不使用该函数,则输出结果为数据的前5行和末尾的5行,中间部分以**...**代替。
import pandas as pddf = pd.read_csv('nba.csv')print(df.to_string())
to_csv()
to_csv()用于将**DataFrame**类型数据存储为**csv**文件。
import pandas as pd# 三个字段 name, site, agenme = ["Google", "Runoob", "Taobao", "Wiki"]st = ["www.google.com", "www.runoob.com", "www.taobao.com", "www.wikipedia.org"]ag = [90, 40, 80, 98]# 字典dict = {'name': nme, 'site': st, 'age': ag}df = pd.DataFrame(dict)# 保存 dataframedf.to_csv('site.csv')
数据处理
head()
head(n)方法用于读取前面的**n**行,如不填写参数n,默认返回5行。
import pandas as pddf = pd.read_csv('nba.csv')print(df.head()) # 打印前5行数据print(df.head(10)) # 打印前10行数据
tail()
tail(n)方法用于读取尾部的**n**行,如不填参数n,默认返回5行,空行各字段的值返回**NaN**。
import pandas as pddf = pd.read_csv('nba.csv')print(df.tail()) # 打印末尾5行print(df.tail(10)) # 打印末尾10行
info()
info()方法用于返回表格的一些基本信息。
import pandas as pddf = pd.read_csv('nba.csv')print(df.info())
JSON文件处理
to_string()
用于返回**DataFrame**类型的数据。
import pandas as pddf = pd.read_json('sites.json')print(df.to_string())
dict转换为DataFrame数据
**JSON**对象与Python字典具有相同的格式,可直接将Python字典转换为DataFrame数据。
import pandas as pd# 字典格式的 JSONs = {"col1":{"row1":1,"row2":2,"row3":3},"col2":{"row1":"x","row2":"y","row3":"z"}}# 读取 JSON 转为 DataFramedf = pd.DataFrame(s)print(df)
从URL中读取JSON数据
import pandas as pdURL = 'https://static.runoob.com/download/sites.json'df = pd.read_json(URL)print(df)
解析JSON文件(字典嵌字典或字典嵌数组的数据结构)
# nested_mix.json文件{"school_name": "local primary school","class": "Year 1","info": {"president": "John Kasich","address": "ABC road, London, UK","contacts": {"email": "admin@e.com","tel": "123456789"}},"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程序 """# 1.loads()载入数据# 2.json_normalize()解析内嵌数据import pandas as pdimport json #导入JSON模块# 使用 Python JSON 模块载入数据with open('nested_mix.json','r') as f:data = json.loads(f.read()) # 使用JSON模块载入数据# 展平数据df_nested_list = pd.json_normalize(data,record_path =['students'], # 使用参数record_path展开内嵌的JSON的记录studentsmeta=[ # 使用参数meta显示其它需要显示的元数据'class',['info', 'president'], # 进入一级嵌套['info', 'contacts', 'tel'] # 进入二级嵌套])print(df_nested_list)
glom模块解析属性(字典嵌字典再嵌数组的数据结构)
glom模块允许使用**.**来访问内嵌对象的属性。
# 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}}]}
# 实现单独显示math字段import pandas as pdfrom glom import glomdf = pd.read_json('nested_deep.json')data = df['students'].apply(lambda row: glom(row, 'grade.math'))print(data)
数据清洗
清洗空值
dropna()方法
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:默认False,如果设置为True,表示新计算结果将覆盖源数据,并返回None
# 示例:删除指定列的空数据import pandas as pddf = pd.read_csv('property-data.csv')df.dropna(subset=['ST_NUM'], inplace = True)print(df.to_string())
isnull()方法
isnull()用于判断单元格是否为空。
import pandas as pddf = pd.read_csv('property-data.csv')print (df['NUM_BEDROOMS'])print (df['NUM_BEDROOMS'].isnull())
指定空数据类型
由于isnull()方法无法识别na或--等类型为空数据,可通过na_vulues参数添加指定类型。
import pandas as pdmissing_values = ["n/a", "na", "--"] # 添加指定空数据类型df = pd.read_csv('property-data.csv', na_values = missing_values)print (df['NUM_BEDROOMS'])print (df['NUM_BEDROOMS'].isnull())
fillna()方法
fillna()用于替换数据中的空字段。
# 示例1:常规替换空字段import pandas as pddf = pd.read_csv('property-data.csv')df.fillna(12345, inplace = True)print(df.to_string())# 示例2:替换指定列的空字段import pandas as pddf = pd.read_csv('property-data.csv')df['PID'].fillna(12345, inplace = True)print(df.to_string())
替换空单元格的常用方法
替换空单元格的常用方法是计算列的均值(mean())、中位数(排序后的中间数值,median())或众数(出现频率最高的数值,mode())。
import pandas as pddf = pd.read_csv('property-data.csv')x = df["ST_NUM"].mean() # 计算均值df["ST_NUM"].fillna(x, inplace = True) # 空值填充均值print(df.to_string())
清洗格式错误数据
通过包含空单元格的行,或将列中的所有单元格转换成相同格式的数据。
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())
清洗错误数据
可以对错误的数据进行替换或移除。
import pandas as pdperson = {"name": ['Google', 'Runoob' , 'Taobao'],"age": [50, 40, 12345] # 12345 年龄数据是错误的}df = pd.DataFrame(person)df.loc[2, 'age'] = 30 # 修改数据--第2行,age列print(df.to_string())
清洗重复数据
duplicated()检测数据是否重复
如果对应的数据是重复的,**duplicated()**会返回**True**,否则返回**False**。
import pandas as pdperson = {"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],"age": [50, 40, 40, 23]}df = pd.DataFrame(person)print(df.duplicated())
drop_duplicates()删除重复数据
import pandas as pdpersons = {"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],"age": [50, 40, 40, 23]}df = pd.DataFrame(persons)df.drop_duplicates(inplace = True)print(df)


