Pandas库
Pandas 一个强大的分析结构化数据的工具集,基础是Numpy(提供高性能的矩阵运算)。
数据结构
一维数据:Series
pd.Series(data,index,dtype,name,copy)
- data:一组数据(ndarray 类型)。
- index:数据索引标签,如果不指定,默认从 0 开始
- dtype:数据类型,默认会自己判断。
- name:设置名称。
- copy:拷贝数据,默认为 False。
Series 是一种类似于一维数组的对象,相当于表格中的一列,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
不指定index
结果全部输出
import pandas as pd
a = [1,2,3]
a = pd.Series(a)
print(a)
# 输出结果:
0 1
1 2
2 3
dtype: int64
指定index
索引结果输出index部分
import pandas as pd
a = ["a","b","c"]
b= pd.Series(a,index=["x","y","z"])
print(b)
# 输出结果:
x a
y b
z c
dtype: object
字典形式
结果是key+value,有index时只输出一部分
import pandas as pd
dict1 = {
1:"Google", 2:"baidu", 3:"360"
}
c = pd.Series(dict1,name='SSS')#设置名称参数
print(c)
# 字典的 key变成了索引值
# 可以指定需要数据的索引输出
d = pd.Series(dict1,index=[1,2],name='AAA')
print(d)
输出结果:
1 Google
2 baidu
3 360
Name: SSS, dtype: object
1 Google
2 baidu
Name: AAA, dtype: object
二维数据Dateframe
pd.DataFrame( data, index, columns, dtype, copy)
- data:一组数据(ndarray、series, map, lists, dict 等类型)。
- index:索引值,或者可以称为行标签。
- columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
- dtype:数据类型。
- copy:拷贝数据,默认为 False。
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
使用ndarrays创建
import pandas as pd
data1 = {
'sites': ['Google','Runoob','Wiki'],
'number' : [1,2,3]
}
a = pd.DataFrame(data1)
print(a)
# 输出结果:
sites number
0 Google 1
1 Runoob 2
2 Wiki 3
使用列表创建
data2 = [
['Google',10],
['Baidu',20],
['360',30]
]
b = pd.DataFrame(data2,columns=['Site','Age'],dtype=float)
print(b)
# 输出结果:
Site Age
0 Google 10.0
1 Baidu 20.0
2 360 30.0
使用字典创建
data3 = [
{
'a':1,
'b':2
},
{
'a':3,
'b':4,
'c':5
}
]
c = pd.DataFrame(data3)
print(c)
# 输出结果(没有对应的部分数据为 NaN):
a b c
0 1 2 NaN
1 3 4 5.0
指定index
data4 = {
"calories": [420, 380, 390],
"duration": [50, 40, 45]
}
d = pd.DataFrame(data4, index = ["day1", "day2", "day3"])
print(d)
# 输出结果:
calories duration
day1 420 50
day2 380 40
day3 390 45
从另一个DataFrame对象创建
即增加列或改变列的数据
import pandas as pd
e = pd.DataFrame(
data = [
[60, 78, 92, 85],
[70, 68, 95, 76],
[88, 98, 83, 87]
],
index = ['小明', '小红', '小强', ],
columns = ['语文', '数学', '英语', '化学'],
dtype = float,
copy = False
)
f = pd.DataFrame(e, copy = False)#浅拷贝
print(f)
f['语文'] = [0, 0, 0]
print(f)
#输出结果:
语文 数学 英语 化学
小明 60.0 78.0 92.0 85.0
小红 70.0 68.0 95.0 76.0
小强 88.0 98.0 83.0 87.0
语文 数学 英语 化学
小明 0 78.0 92.0 85.0
小红 0 68.0 95.0 76.0
小强 0 98.0 83.0 87.0
删除列
使用, axis = 0表示对行操作, axis = 1表示针对列的操作, inplace为True, 则直接在源数据上进行修改, 否则源数据会保持原样
dataFrame.drop('化学', axis = 1, inplace = True)
使用loc属性返回指定行的数据
data1.loc[index]
返回第一行:
print(data1.loc[0])
返回多行:
print(data1.loc[[0,2]])#第一和第三行
指定indx:
data1 = pd.DataFrame(data, index = ["day1", "day2", "day3"])
print(df.loc["day2"])#即返回day2对应的行
一维数据:
sites = {
1:"Google", 2:"baidu", 3:"360"
}
a = pd.Series(sites)
print(a)
print(a.loc[2])#返回baidu
存储
-
.to_csv(路径):保存为.csv文件
-
.to_excel(路径):保存为.xlsx文件
提取数据
从文件读取
- read_csv(filepath_or_buffer = 文件路径, delimiter = 分隔符, header = 是否第一行为列标题, engine = 引擎, encoding = 编码):读取.csv文件创建DataFrame对象
import pandas as pd
dataFrame = pd.read_csv('../数据/test.csv')
print(dataFrame)
- read_excel(路径, header = 指定哪一行为标题, names = 指定列标题):读取.xlsx文件创建DataFrame对象
import pandas as pd
dataFrame = pd.read_excel(
'../数据/test.XLSX',
header = None
)
print(dataFrame)
DataFrame 查看数据
- .head(n = 5):查看数据前n行
- .tail(n = 5):查看数据后n行
- .info():查看数据信息
- .describe():查看数据统计信息
DataFrame 操作
纵向叠加
-
concat(dataFrame列表):将这些dataFrame的数据纵向叠加
import pandas as pd dataFrame1 = pd.DataFrame( data=[ ['一级', '读书', 21, 176], ['二级', '游泳', 22, 178], ['三级', '游泳', 21, 185], ['二级', '游泳', 19, 182], ], columns=['等级', '爱好', '年龄', '身高'], index = ['小明', '小红', '小强', '小于'] ) r = pd.concat([dataFrame1, dataFrame1]) print(r) #输出结果: 等级 爱好 年龄 身高 小明 一级 读书 21 176 小红 二级 游泳 22 178 小强 三级 游泳 21 185 小于 二级 游泳 19 182 小明 一级 读书 21 176 小红 二级 游泳 22 178 小强 三级 游泳 21 185 小于 二级 游泳 19 182
横向合并
- merge(left = 左表, right = 右表, left_index, right_index, how = 连接方式( inner, left, right, outer)):按照指定连接方式将两个表合并
import pandas as pd
dataFrame1 = pd.DataFrame(
data=[
['一级', '读书', 21, 176],
['二级', '游泳', 22, 178],
['三级', '游泳', 21, 185],
['二级', '游泳', 19, 182],
],
columns=['等级', '爱好', '年龄', '身高'],
index=['小明', '小红', '小强', '小于']
)
print(dataFrame1)
dataFrame2 = pd.DataFrame(
data=[
['学士', 'O'],
['学士', 'A'],
['博士', 'A'],
['院士', 'B'],
],
columns=['学位', '血型'],
index=['小明', '小红', '小强', '小于']
)
print(dataFrame2)
r = pd.merge(
left=dataFrame1,
right=dataFrame2,
left_index=True,
right_index=True,
how='inner'
)
print(r)
#输出结果:
等级 爱好 年龄 身高
小明 一级 读书 21 176
小红 二级 游泳 22 178
小强 三级 游泳 21 185
小于 二级 游泳 19 182
学位 血型
小明 学士 O
小红 学士 A
小强 博士 A
小于 院士 B
等级 爱好 年龄 身高 学位 血型
小明 一级 读书 21 176 学士 O
小红 二级 游泳 22 178 学士 A
小强 三级 游泳 21 185 博士 A
小于 二级 游泳 19 182 院士 B
空值处理
- .dropna(subset = 列名):指定当某列出现空值才删除,没有subset时,只要一行中任意一个字段为空,就会被删除
- .isnull():返回布尔DataFrame对象(是否是空值)
删除空值
import pandas
dataFrame = pandas.DataFrame(
data=[
['一级', None, 21, 176],
['二级', '游泳', None, 178],
['三级', '游泳', 21, 185],
[None, '游泳', 19, None],
],
columns=['等级', '爱好', '年龄', '身高'],
index=['小明', '小红', '小强', '小于']
)
print(dataFrame)
print(dataFrame.dropna())
#输出结果:
等级 爱好 年龄 身高
小明 一级 None 21.0 176.0
小红 二级 游泳 NaN 178.0
小强 三级 游泳 21.0 185.0
小于 None 游泳 19.0 NaN
等级 爱好 年龄 身高
小强 三级 游泳 21.0 185.0
判断空值
import pandas as pd
dataFrame = pd.DataFrame(
data=[
['一级', None, 21, 176],
['二级', '游泳', None, 178],
['三级', '游泳', 21, 185],
[None, '游泳', 19, None],
],
columns=['等级', '爱好', '年龄', '身高'],
index=['小明', '小红', '小强', '小于']
)
print(dataFrame)
print(dataFrame.isnull())
print(dataFrame['等级'].isnull())
#输出结果:
等级 爱好 年龄 身高
小明 一级 None 21.0 176.0
小红 二级 游泳 NaN 178.0
小强 三级 游泳 21.0 185.0
小于 None 游泳 19.0 NaN
等级 爱好 年龄 身高
小明 False True False False
小红 False False True False
小强 False False False False
小于 True False False True
小明 False
小红 False
小强 False
小于 True
Name: 等级, dtype: bool
计算空值个数
import pandas as pd
dataFrame = pd.DataFrame(
data=[
['一级', None, 21, 176],
['二级', '游泳', None, 178],
['三级', '游泳', 21, 185],
[None, '游泳', 19, None],
],
columns=['等级', '爱好', '年龄', '身高'],
index=['小明', '小红', '小强', '小于']
)
print(dataFrame)
print(dataFrame.isnull().sum())
#输出结果:
等级 爱好 年龄 身高
小明 一级 None 21.0 176.0
小红 二级 游泳 NaN 178.0
小强 三级 游泳 21.0 185.0
小于 None 游泳 19.0 NaN
等级 1
爱好 1
年龄 1
身高 1
dtype: int64
填充空值
import pandas as pd
dataFrame = pd.DataFrame(
data=[
['一级', None, 21, 176],
['二级', '游泳', None, 178],
['三级', '游泳', 21, 185],
[None, '游泳', 19, None],
],
columns=['等级', '爱好', '年龄', '身高'],
index=['小明', '小红', '小强', '小于']
)
print(dataFrame)
dataFrame['年龄'] = dataFrame['年龄'].fillna(20)
print(dataFrame)
#输出结果:
小明 一级 None 21.0 176.0
小红 二级 游泳 NaN 178.0
小强 三级 游泳 21.0 185.0
小于 None 游泳 19.0 NaN
等级 爱好 年龄 身高
小明 一级 None 21.0 176.0
小红 二级 游泳 20.0 178.0
小强 三级 游泳 21.0 185.0
小于 None 游泳 19.0 NaN
去重
.dropduplicates(subset = 列名列表, keep = ‘first’ 或 ‘last’):删除完全重复行, 可指定某字段重复时删除, 默认保留第一个, 后面重复的会删掉
import pandas as pd
dataFrame = pd.DataFrame(
data=[
['一级', None, 21, 176],
['二级', '游泳', None, 178],
['三级', '游泳', 21, 185],
[None, '游泳', 19, None],
],
columns=['等级', '爱好', '年龄', '身高'],
index=['小明', '小红', '小强', '小于']
)
print(dataFrame)
print(dataFrame.drop_duplicates(subset = ['爱好'], keep = 'first'))
#输出结果:
等级 爱好 年龄 身高
小明 一级 None 21.0 176.0
小红 二级 游泳 NaN 178.0
小强 三级 游泳 21.0 185.0
小于 None 游泳 19.0 NaN
等级 爱好 年龄 身高
小明 一级 None 21.0 176.0
小红 二级 游泳 NaN 178.0
排序
.sort_values(by = 列名, ascending = 是否升序):对某列排序
import pandas as pd
dataFrame = pd.DataFrame(
data=[
['一级', None, 21, 176],
['二级', '游泳', None, 178],
['三级', '游泳', 21, 185],
[None, '游泳', 19, None],
],
columns=['等级', '爱好', '年龄', '身高'],
index=['小明', '小红', '小强', '小于']
)
print(dataFrame)
dataFrame = dataFrame.sort_values(by = '等级', ascending = True)
print(dataFrame)
#输出结果:
等级 爱好 年龄 身高
小明 一级 None 21.0 176.0
小红 二级 游泳 NaN 178.0
小强 三级 游泳 21.0 185.0
小于 None 游泳 19.0 NaN
等级 爱好 年龄 身高
小明 一级 None 21.0 176.0
小强 三级 游泳 21.0 185.0
小红 二级 游泳 NaN 178.0
小于 None 游泳 19.0 NaN
分组
分组就是把指定的一列的值相同的分为一组, 调用一些函数对这些指定列值相同数据进行操作
.groupby(‘列名’):对指定列分组, 就是把该列值一样的分成一组
import pandas as pd
dataFrame = pd.DataFrame(
data=[
['一级', '读书', 21, 176],
['二级', '游泳', 20, 178],
['三级', '游泳', 21, 185],
['四级', '游泳', 19, 177],
],
columns=['等级', '爱好', '年龄', '身高'],
index=['小明', '小红', '小强', '小于']
)
print(dataFrame)
groupData = dataFrame.groupby('年龄')
分段
cut(x = 切分数据, bins = 切分方式, right = 是否包含右区间, labels = 分割后每段的名字列表):对一个数组进行分段
import pandas as pd
dataFrame = pd.DataFrame(
data=[
['一级', '读书', 21, 176],
['二级', '游泳', 20, 178],
['三级', '游泳', 21, 185],
['四级', '游泳', 19, 177],
['四级', '读书', 19, 165],
['四级', '读书', 19, 190],
],
columns=['等级', '爱好', '年龄', '身高'],
index=['小明', '小红', '小强', '小于', '小兰', '小智']
)
r = pd.cut(x = dataFrame['身高'], bins = [160, 170, 180, 190, 200], right = False, labels = ['中等身高', '身高较高', '身高很高', '身高太高'])
print(r, end = '\n')
r = pd.cut(x=dataFrame['身高'], bins = 4, right=False, labels=['中等身高', '身高较高', '身高很高', '身高太高'])
print(r)
#输出结果:
小明 身高较高
小红 身高较高
小强 身高很高
小于 身高较高
小兰 中等身高
小智 身高太高
Name: 身高, dtype: category
Categories (4, object): ['中等身高' < '身高较高' < '身高很高' < '身高太高']
小明 身高较高
小红 身高很高
小强 身高太高
小于 身高较高
小兰 中等身高
小智 身高太高
Name: 身高, dtype: category
Categories (4, object): ['中等身高' < '身高较高' < '身高很高' < '身高太高']