这一篇博文是【 AI学习路线图】系列文章的其中一篇,点击查看目录:AI学习完整路线图
pandas中有两种数据结构:Series和DataFrame。
- Series类似于一维数组,是由一组数据(类型值)以及一组与之相关的数据标签(索引)组成。
- DataFrame一个表格型的数据结构,每一列的值类型可以不同,DataFrame既有行的索引也有列的索引,可以被看做是由Series组成的字典。
series 是一种一维的数据类型,其中的每个元素都有各自的标签。标签可以是数字或者字符。
##引入pandas
import numpy as np
import pandas as pd
#定义一个一维数组,通过一维数组来创建Series
arr=np.array([1,3,5,np.NaN,10])
#创建一个Series
series1=pd.Series(arr)
print(series1)
#Series的数据类型
print(series1.dtype)
#Series的索引值
print(series1.index)
#Series的值
print(series1.values)
输出:
0 1.0
1 3.0
2 5.0
3 NaN
4 10.0
dtype: float64
float64
RangeIndex(start=0, stop=5, step=1)
[ 1. 3. 5. nan 10.]
(2) 修改索引值
# 通过一维数组,创建一个Series
series2 = pd.Series([87, 90, 89])
#默认的Series索引是从0开始,步长为1的数字序列
print("默认的series2:")
print(series2)
# 修改索引值
series2.index = ['语文', '数学', '英语']
print("修改后的series2:\n", series2)
# 创建Series时指定值和索引
series3 = pd.Series(data=[89, 90, 95.], dtype=np.int64, index=['语文', '数学', '英语'])
print("series3:\n", series3)
输出:
默认的series2:
0 87
1 90
2 89
dtype: int64
修改后的series2:
语文 87
数学 90
英语 89
dtype: int64
series3:
语文 89
数学 90
英语 95
dtype: int64
print("-----使用字典方式创建Series-----------")
series4=pd.Series({'语文':90,'数学':85,'英语':100})
print(series4)
print("dtype:",series4.dtype)
print("index:",series4.index)
print("values:",series4.values)
输出:
-----使用字典方式创建Series-----------
数学 85
英语 100
语文 90
dtype: int64
dtype: int64
index: Index(['数学', '英语', '语文'], dtype='object')
values: [ 85 100 90]
有两种数据读取方式:方括号+索引、方括号+下标值
series4 = pd.Series({'语文': 90, '数学': 85, '英语': 100})
print("Series为:")
print(series4)
# 索引值读取
print(series4['语文'])
# 下标值读取
print(series4[0])
print("切片1:")
# 切片包括边界值
print(series4['英语':'语文'])
print("切片2:")
# 切片不包括结束值
print(series4[1:2])
Series为:
数学 85
英语 100
语文 90
dtype: int64
90
85
切片1:
英语 100
语文 90
dtype: int64
切片2:
英语 100
dtype: int64
Series是numpy的升级版,numpy的运算series也可以进行运算。
当多个series对象之间进行运算时,series之间会根据索引值自动对齐后进行相应的运算,如果对应不上,结果就为NaN。
print("-------series自动对齐----------------")
arr1 = pd.Series([12, 23, 34], index=['p1', 'p2', 'p3'])
arr2 = pd.Series([54, 43, 32, 27], index=['p2', 'p3', 'p4', 'p5'])
# 两个series相加,是对应的索引的相加,对应不上的,结果为NaN
print("相加结果")
print(arr1 + arr2)
print("相乘结果")
print(arr1 * arr2)
print("相除结果")
print(arr1 / arr2)
-------series自动对齐----------------
相加结果
p1 NaN
p2 77.0
p3 77.0
p4 NaN
p5 NaN
dtype: float64
相乘结果
p1 NaN
p2 1242.0
p3 1462.0
p4 NaN
p5 NaN
dtype: float64
相除结果
p1 NaN
p2 0.425926
p3 0.790698
p4 NaN
p5 NaN
dtype: float64
Series对象本身有一个name属性,默认为空,index也有一个name属性。
print("-----nane属性-----------")
series4 = pd.Series({'语文': 90, '数学': 85, '英语': 100})
series4.name='考试成绩'
series4.index.name='科目'
print(series4)
-----nane属性-----------
科目
数学 85
英语 100
语文 90
Name: 考试成绩, dtype: int64
pandas中有isnull和notnull两个函数,用于检测Series中缺失值,他们都返回一个布尔类型的Series
print("-----缺失值检测-----------")
series4 = pd.Series({'语文': 90, '数学': 85, '英语': np.NaN})
print(" ---检测各个值是否为空:")
print(pd.isnull(series4))
print(" ---返回为空的值:")
print(series4[pd.isnull(series4)])
print(" ---检测各个值是否为不为空:")
print(pd.notnull(series4))
print(" ---返回不为空的值:")
print(series4[pd.notnull(series4)])
-----缺失值检测-----------
---检测各个值是否为空:
数学 False
英语 True
语文 False
dtype: bool
---返回为空的值:
英语 NaN
dtype: float64
---检测各个值是否为不为空:
数学 True
英语 False
语文 True
dtype: bool
---返回不为空的值:
数学 85.0
语文 90.0
dtype: float64
dataframe 是一个二维的、表格型的数据结构。行轴有标签,列轴也有标签。可以把它当作一个 series 的字典。
import numpy as np
import pandas as pd
data = np.array([
[90, 80, 70],
[60, 50, 40],
[30, 20, 10]]
)
# 定义一个dataframe,默认的行索引和列索引都是数字
print("默认方式创建DataFrame")
df1 = pd.DataFrame(data)
print(df1)
# 定义一个dataframe,指定行索引和列索引
print("指定列索引和行索引")
df1 = pd.DataFrame(data=data,
columns=['语文', '数学', '英语'],
index=['张三', '李四', '王五'])
print(df1)
0 1 2
0 90 80 70
1 60 50 40
2 30 20 10
语文 数学 英语
张三 90 80 70
李四 60 50 40
王五 30 20 10
df1 = pd.DataFrame(data=data,
columns=['语文', '数学', '英语'],
index=['张三', '李四', '王五'])
print("----------------2-----------")
print(df1)
print('列:----')
#查询某一列的数据
print(df1['数学'])
print('行:----')
#查询某一行的数据
print(df1.ix['李四'])
#修改列的值
df1["数学"]=[1,2,3]
#修改行的值
df1.ix['李四']=[11,12,13]
print("修改后的:")
print(df1)
输出:
----------------2-----------
语文 数学 英语
张三 90 80 70
李四 60 50 40
王五 30 20 10
列:----
张三 80
李四 50
王五 20
Name: 数学, dtype: int32
行:----
语文 60
数学 50
英语 40
Name: 李四, dtype: int32
修改后的:
语文 数学 英语
张三 90 1 70
李四 11 12 13
王五 30 3 10
方法 | 说明 |
---|---|
count | 计算非NaN值的数量 |
describe | 针对Series或者各DataFrame列计算总统计值 |
min/max | 计算最大值、最小值 |
argmin/argmax | 计算最大值、最小值索引的位置 |
idxmin/idxmax | 计算最大值、最小值索引值 |
quantile | 计算样本的分位数 |
sum | 值的总和 |
mean | 值的平均值 |
median | 值的中位数 |
header 方法名 | header 说明 |
---|---|
head(num) | 返回前面的num行数据 |
tail(num) | 返回最后的num行数据 |
len() | 返回有多少行数据 |
describe() | 返回数据的一些基本的统计信息 |
import pandas as pd
# 用read_csv方法读取文件内容
df = pd.read_csv("ca_list_copy(2).csv")
print(df.head(3))
print(df.tail(3))
print("数据行数:",df.__len__())
print(df.describe())
#读取txt文件
dftxt = pd.read_csv('data.txt', sep=',', header=None)
dftxt.columns=['id','姓名','年龄']
print(dftxt)
pandas可以对DataFrame结构,根据值过滤。
import pandas as pd
# 用read_csv方法读取文件内容
df = pd.read_csv("ca_list_copy(2).csv")
#通过值过滤,并的关系用 &
print(df[(df.zwyx > 35000)
& (df.Id > 1000)
& (df.zwmc.str.startswith('数据分析'))])
import pandas as pd
# 用read_csv方法读取文件内容
df = pd.read_csv("ca_list_copy(2).csv")
#列索引
print(df['zwyx'])
print(df.zwyx)
#行索引
print(df.iloc[10])
print(df.loc[10])
#根据索引排序
print(df.sort_index(ascending=False).head(5))
可以给Series设置一个多层索引,可以看做多级分类,可以根据分类(层次)来索引出这个分类下的所有数据。
举例:
import pandas as pd
# 层次索引,2001,2002是第一层
data = pd.Series([22.1, 44, 88, 98.5, 30],
index=[
[2001, 2001, 2001, 2002, 2002],
['苹果', '香蕉', '西瓜', '苹果', '西瓜']
]
)
print(data)
print("层次索引取值:\n---------")
print(data[2002])
print(data[2002]["西瓜"])
##--------------------------------
输出:
2001 苹果 22.1
香蕉 44.0
西瓜 88.0
2002 苹果 98.5
西瓜 30.0
dtype: float64
层次索引取值:
苹果 98.5
西瓜 30.0
dtype: float64
30.0
pandas可以从csv、txt、xlsx等文件中导入数据。
例子:
# 用read_csv方法读取文件内容
#header=0指定第0行是列名称,如果省略header参数,默认第一列是列名。
#如果没有列名,header='None'
df1 = pd.read_csv("ca_list_copy(2).csv", header=0)
参考链接:https://my.oschina.net/lionets/blog/280332
对于两个相关的数据集,可以根据某一列对它们进行合并,类似于MySQL里的join。
下面是一个实例
import pandas as pd
df1 = pd.DataFrame([
[1, '张三'],
[2, '李四'],
[3, '王五']
],
columns=['id', '姓名'])
df2 = pd.DataFrame([
[1, 18],
[3, 24],
[4, 28]
],
columns=['id', '年龄'])
#根据一个字段join两个集合
df = df1.merge(df2, on='id')
print(df)
======================
结果是:
id 姓名 年龄
0 1 张三 18
1 3 王五 24
对于DataFrame或者Series中的NaN值,一般采取的方式是删除对应的行或者列,或者填充一个默认值。
有几个方法可以实现以上的操作:
方法 | 说明 |
---|---|
dropna | 根据标签的值中是否存在缺失数据,对轴标签进行删除,可以通过参数调解对缺失值的容忍度 |
fillna | 用指定值或者插值的方式填充缺失的数据,比如:ffill或者bfill |
isnull | 返回一个含有布尔值的对象,这些布尔值表示哪些值是确实只NA |
notnull | isnull的否定式 |
实例:
import numpy as np
import pandas as pd
# 定义一个有NaN值的DataFrame
df = pd.DataFrame([
['Tom', np.NaN, 456.67, 'M'],
['Merry', 34, 456.67, np.NaN],
[np.NaN, np.NaN, np.NaN, np.NaN],
['John', 23, np.NaN, 'M'],
['Joe', 18, '2300', 'F']
],
columns=['姓名', '年龄', '工资', '性别']
)
print("原DataFrame\n",df)
# 判断每个元素是否是NaN
print(df.isnull())
# 判断每个原始是否不是NaN
print(df.notnull())
# dropna默认是将包含NaN值的行整个删除
print(df.dropna())
# 如果行里都是NaN值,才删除行
print(df.dropna(how='all'))
# 按维度删除
print(df.dropna(axis=0, how='all'))
# 对空值进行填充。
print(df.fillna(999999))
Pandas可以通过plot快速绘图,功能并不如Matplotlib强大,但是可以粗略地看下数据图。
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("ca_list_copy(2).csv")
df.plot(x='Id',y='zwyx')
plt.show()