安装
pip install pandas
Series
定义
Paddas Series
类似表格中的一个列(column
),属于一维数组,可以保存任意数据类型。
Series
由索引(index
)和列组成。
import pandas as pd
pd.series(data, index, dtype, name, copy)
其中:
* data:一组数据(ndarray类型);
* index:数据索引标签,默认从0开始;
* dtype:数据类型,默认程序自动判断;
* name:设置名称;
* copy:拷贝数据,默认为False。
创建Series
对象
创建空Series
对象
import pandas as pd
pd.Series() # 空Series----一般编译器会报错
ndarray
创建Series
对象
# 指定index
import pandas as pd
import numpy as np
data = np.array(["a", "b", "c", "d", "e"])
df = pd.Series(data, index=[1, 2, 3, 4, 5]) # 指定index
print(df)
dict
创建Series
对象
# 指定index
import pandas as pd
import numpy as np
data = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
df = pd.Series(data, index=["a", "d", "c", "b", "e"]) # 指定index,指定的index不在keys内,将填充NaN
print(df)
标量创建Series
对象
使用标量创建**Series**
对象,必须提供索引值。
import pandas as pd
import numpy as np
df = pd.Series(5, index=[1, 2, 3, 4, 5]) # 必须指定index
print(df)
访问Series
数据
位置索引访问
import pandas as pd
s = 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 pd
s = 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 pd
data = [['Google',10],['Runoob',12],['Wiki',13]]
df = pd.DataFrame(data,columns=['Site','Age'],dtype=float)
print(df)
# ndarrays创建方式----键值对方式
import pandas as pd
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13]}
df = pd.DataFrame(data)
print (df)
# 字典创建方式----键值对
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}] # 没有对应的数据,自动填充为NaN
df = 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 pd
data = {
"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 pd
df = pd.read_csv('nba.csv')
print(df.to_string())
to_csv()
to_csv()
用于将**DataFrame**
类型数据存储为**csv**
文件。
import pandas as pd
# 三个字段 name, site, age
nme = ["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)
# 保存 dataframe
df.to_csv('site.csv')
数据处理
head()
head(n)
方法用于读取前面的**n**
行,如不填写参数n
,默认返回5
行。
import pandas as pd
df = pd.read_csv('nba.csv')
print(df.head()) # 打印前5行数据
print(df.head(10)) # 打印前10行数据
tail()
tail(n)
方法用于读取尾部的**n**
行,如不填参数n
,默认返回5
行,空行各字段的值返回**NaN**
。
import pandas as pd
df = pd.read_csv('nba.csv')
print(df.tail()) # 打印末尾5行
print(df.tail(10)) # 打印末尾10行
info()
info()
方法用于返回表格的一些基本信息。
import pandas as pd
df = pd.read_csv('nba.csv')
print(df.info())
JSON
文件处理
to_string()
用于返回**DataFrame**
类型的数据。
import pandas as pd
df = pd.read_json('sites.json')
print(df.to_string())
dict
转换为DataFrame
数据
**JSON**
对象与Python字典具有相同的格式,可直接将Python字典转换为DataFrame数据。
import pandas as pd
# 字典格式的 JSON
s = {
"col1":{"row1":1,"row2":2,"row3":3},
"col2":{"row1":"x","row2":"y","row3":"z"}
}
# 读取 JSON 转为 DataFrame
df = pd.DataFrame(s)
print(df)
从URL
中读取JSON
数据
import pandas as pd
URL = '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 pd
import 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的记录students
meta=[ # 使用参数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 pd
from glom import glom
df = 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 pd
df = pd.read_csv('property-data.csv')
df.dropna(subset=['ST_NUM'], inplace = True)
print(df.to_string())
isnull()
方法
isnull()
用于判断单元格是否为空。
import pandas as pd
df = pd.read_csv('property-data.csv')
print (df['NUM_BEDROOMS'])
print (df['NUM_BEDROOMS'].isnull())
指定空数据类型
由于isnull()
方法无法识别na
或--
等类型为空数据,可通过na_vulues
参数添加指定类型。
import pandas as pd
missing_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 pd
df = pd.read_csv('property-data.csv')
df.fillna(12345, inplace = True)
print(df.to_string())
# 示例2:替换指定列的空字段
import pandas as pd
df = pd.read_csv('property-data.csv')
df['PID'].fillna(12345, inplace = True)
print(df.to_string())
替换空单元格的常用方法
替换空单元格的常用方法是计算列的均值(mean()
)、中位数(排序后的中间数值,median()
)或众数(出现频率最高的数值,mode()
)。
import pandas as pd
df = 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 pd
person = {
"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 pd
person = {
"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(person)
print(df.duplicated())
drop_duplicates()
删除重复数据
import pandas as pd
persons = {
"name": ['Google', 'Runoob', 'Runoob', 'Taobao'],
"age": [50, 40, 40, 23]
}
df = pd.DataFrame(persons)
df.drop_duplicates(inplace = True)
print(df)