一、Pandas是什么
Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
二、Pandas 的安装和使用
pip install pandas # 通过pip命令安装
import pandas # 导入pandas包使用
三、Pandas 数据结构
1. 一维数据:Series
Series 是一种类似于一维数组的对象,相当于表格中的一列,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
Series 的构造
# Series 的构造方法:
pandas.Series( data, index, dtype, name, copy)
data:一组数据(ndarray 类型)。
index:数据索引标签,如果不指定,默认从 0 开始。
dtype:数据类型,默认会自己判断。
name:设置名称。
copy:拷贝数据,默认为 False。
用不同方式构建 Series
# 构建一个 Series 不指定 index
import pandas
a = [1,2,3]
myvar1 = pandas.Series(a)
print(myvar1)
# 输出结果:
0 1
1 2
2 3
dtype: int64
# 构建一个 Series 指定 index
import pandas
a = ["a","b","c"]
myvar2 = pandas.Series(a,index=["x","y","z"])
print(myvar2)
# 输出结果:
x a
y b
z c
dtype: object
# 使用 key/value对象,类似字典来创建 Series
import pandas
sites = {
1:"Google", 2:"baidu", 3:"360"
}
myvar3 = pandas.Series(sites)
print(myvar3)
# 字典的 key变成了索引值
# 可以指定需要数据的索引输出
myvar4 = pandas.Series(sites,index=[1,2])
print(myvar4)
输出结果:
1 Google
2 baidu
3 360
dtype: object
1 Google
2 baidu
dtype: object
# 设置 Series的名称参数
import pandas
sites = {
1:"Google", 2:"baidu", 3:"360"
}
myvar5 = pandas.Series(sites,name="Series_Test")
print(myvar5)
输出结果:
1 Google
2 baidu
3 360
Name: Series_Test, dtype: object
2. 二维数据 DataFrame
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
DataFrame 的构造
# DataFrame的构造
pandas.DataFrame( data, index, columns, dtype, copy)
data:一组数据(ndarray、series, map, lists, dict 等类型)。
index:索引值,或者可以称为行标签。
columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
dtype:数据类型。
copy:拷贝数据,默认为 False。
用不同方式构建DataFrame
# pandas 构建二维数据
import pandas as pd
# 使用ndarrays创建
data1 = {
'sites': ['Google','Runoob','Wiki'],
'number' : [1,2,3]
}
myvar1 = pd.DataFrame(data1)
print(myvar1)
# 输出结果:
sites number
0 Google 1
1 Runoob 2
2 Wiki 3
# 使用列表创建
data2 = [
['Google',10],
['Baidu',20],
['360',30]
]
myvar2 = pd.DataFrame(data2,columns=['Site','Age'],dtype=float)
print(myvar2)
# 输出结果:
Site Age
0 Google 10.0
1 Baidu 20.0
2 360 30.0
# 使用字典创建
data3 = [
{
'a':1,
'b':2
},
{
'a':4,
'b':5,
'c':9
}
]
myvar3 = pd.DataFrame(data3)
print(myvar3)
# 没有对应的部分数据为 NaN。
# 输出结果:
a b c
0 1 2 NaN
1 4 5 9.0
# 指定index
data4 = {
"calories": [420, 380, 390],
"duration": [50, 40, 45]
}
myvar4 = pd.DataFrame(data4, index = ["day1", "day2", "day3"])
print(myvar4)
# 输出结果:
calories duration
day1 420 50
day2 380 40
day3 390 45
3. 使用loc
属性返回指定行的数据
# 使用`loc`属性返回指定行的数据
import pandas as pd
data = {
"calories": [420, 380, 390],
"duration": [50, 40, 45]
}
# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)
print(df)
# 输出结果:
calories duration
0 420 50
1 380 40
2 390 45
# 返回第一行
print(df.loc[0])
# 输出结果:
calories 420
duration 50
Name: 0, dtype: int64
# 返回第二行
print(df.loc[1])
# 输出结果:
calories 380
duration 40
Name: 1, dtype: int64
# 返回多行[[...]] ...为各行的索引
print(df.loc[[0,2]])
# 输出结果:
calories duration
0 420 50
2 390 45
print(df.loc[[0,1,2]])
# 输出结果:
calories duration
0 420 50
1 380 40
2 390 45
# 指定index输出
df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
print(df.loc["day2"])
# 输出结果:
calories 380
duration 40
Name: day2, dtype: int64
# 一维数据同理
sites = {
1:"Google", 2:"baidu", 3:"360"
}
myvar = pd.Series(sites)
print(myvar)
print(myvar.loc[2])
# 输出结果:
Name: day2, dtype: int64
1 Google
2 baidu
3 360
dtype: object
baidu
四、Pandas CSV文件
CSV(Comma-Separated Values,逗号分隔值,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
CSV 是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。
1. to_string()
用于返回 DataFrame 类型的数据
import pandas as pd
df = pd.read_csv('nba.csv')
print(df.to_string()) # 返回 DataFrame 类型的数据
print(df) # 输出结果为数据的前面5行和末尾5行,中间部分以 ... 代替。
如果不加
to_string()
,输出结果为数据的前面5行和末尾5行,中间部分以…代替。
2. to_csv()
方法将 DataFrame 存储为 csv 文件
import pandas as pd
# 使用to_csv()方法将DataFrame存储为csv文件
# 三个字段 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')
3. 数据处理
head(n)
方法用于读取前面的 n 行,如果不填参数,默认返回5行。
tail(n)
方法用于读取尾部的 n 行,如果不填参数,默认返回5行,空行各个字段的值返回 NaN。
info()
方法返回表格的一些基本信息。
# 数据处理
import pandas as pd
df = pd.read_csv('nba.csv')
print(df.head(2)) # 读取前面的2行,如果不填参数,默认返回5行。
print(df.tail(3)) # 读取尾部的3行,如果不填参数,默认返回5行,空行各个字段的值返回 NaN。
print(df.info()) # 返回表格的一些基本信息
# 基本信息的输出结果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 458 entries, 0 to 457
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Name 457 non-null object
1 Team 457 non-null object
2 Number 457 non-null float64
3 Position 457 non-null object
4 Age 457 non-null float64
5 Height 457 non-null object
6 Weight 457 non-null float64
7 College 373 non-null object
8 Salary 446 non-null float64
dtypes: float64(4), object(5)
memory usage: 32.3+ KB
None
non-null,意思为非空的数据
五、Pandas JSON
JSON(JavaScript Object Notation,JavaScript 对象表示法),是存储和交换文本信息的语法,类似 XML。
JSON 比 XML 更小、更快,更易解析。
Pandas 可以很方便的处理 JSON 数据。
1. 读取JSON数据
import pandas as pd
df = pd.read_json('sites.json')
print(df.to_string()) # to_string()用于返回 DataFrame类型的数据,也可以直接处理 JSON字符串
# 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
df1 = pd.DataFrame(s)
print(df1)
# 从 URL 中读取 JSON 数据:
URL = 'https://static.runoob.com/download/sites.json'
df2 = pd.read_json(URL)
print(df2)
2. 内嵌的JSON数据
# 读取内嵌的JSON数据文件
import pandas as pd
'''
nested_list.json
{
"school_name": "ABC primary school",
"class": "Year 1",
"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
}]
}
'''
df = pd.read_json('nested_list.json')
print(df) # 内嵌数据无法完全显示
# 使用json_normalize() 方法将内嵌的数据完整的解析出来
import json
with open('nested_list.json','r') as f:
data = json.loads(f.read()) # 使用 Python JSON 模块载入数据
# 展平数据2
df_nested_list = pd.json_normalize(
data,
record_path =['students'], # 参数 record_path设置为['students']用于展开内嵌的 JSON数据 students。
meta=['school_name', 'class'] # 使用 meta参数来显示这些元数据
)
print(df_nested_list)
## 输出结果:
school_name ... students
0 ABC primary school ... {'id': 'A001', 'name': 'Tom', 'math': 60, 'phy...
1 ABC primary school ... {'id': 'A002', 'name': 'James', 'math': 89, 'p...
2 ABC primary school ... {'id': 'A003', 'name': 'Jenny', 'math': 79, 'p...
[3 rows x 3 columns]
id name math physics chemistry school_name class
0 A001 Tom 60 66 61 ABC primary school Year 1
1 A002 James 89 76 51 ABC primary school Year 1
2 A003 Jenny 79 90 78 ABC primary school Year 1
# 读取更复杂的嵌套了列表和字典 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
}]
}
'''
import pandas as pd
import json
# 使用 Python JSON 模块载入数据
with open('nested_mix.json','r') as f:
data = json.loads(f.read())
dff = pd.json_normalize(
data,
record_path =['students'],
meta=[
'class',
['info', 'president'],
['info', 'contacts', 'tel']
]
)
print(dff)
# 输出结果:
id name math physics chemistry school_name class
0 A001 Tom 60 66 61 ABC primary school Year 1
1 A002 James 89 76 51 ABC primary school Year 1
2 A003 Jenny 79 90 78 ABC primary school Year 1
id name math ... class info.president info.contacts.tel
0 A001 Tom 60 ... Year 1 John Kasich 123456789
1 A002 James 89 ... Year 1 John Kasich 123456789
2 A003 Jenny 79 ... Year 1 John Kasich 123456789
[3 rows x 8 columns]
# 只读取内嵌中的 math 字段
'''
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
}
}]
}
'''
# 使用 glom模块来处理数据套嵌,glom模块允许我们使用 . 来访问内嵌对象的属性。
import pandas as pd
from glom import glom
dfff = pd.read_json('nested_deep.json')
data = dfff['students'].apply(lambda row: glom(row, 'grade.math'))
print(data)
# 输出结果:
0 60
1 89
2 79
Name: students, dtype: int64
来源:菜鸟教程-pandas