pandas之DataFramer入门到弃坑
一 前言
前文写了 Series 一维的数据集,可以理解为一个一维数组,本篇将学习DataFrame 是用于储存多维数据集;觉得知识追寻者文章不错,可以点赞加关注,读者的肯定才是对作者最大的创作动力;
公众号:知识追寻者
知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)
二 创建
DataFrame 如何理解,简单的理解就是像excel 表格一个,有行有列;实质上每个DataFrame 都是多个Series组合而成,可以将DataFrame的单个列看作是 一个Series
2.1 简单创建
如下的方式进行创建DataFrame
, 会将字典的键当作 DataFrame 的列,数组值当作 DataFrame 的列值;与Series一样,DataFrame 也会创建默认的索引(从0开始)
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
data = {
'user' : ['zszxz','craler','rose'],
'sequence' : [100, 101, 102],
'age' : [18,18,18]
}
frame = pd.DataFrame(data)
print(frame)
输出
user sequence age
0 zszxz 100 18
1 craler 101 18
2 rose 102 18
2.2 指定索引创建
除了默认的索引,还可以指定索引,这是一个非常有必要的操作,这样可以让你的数据更改有代表意义,索引的位数,最好跟数据(下面user列的数据就是3位)一致,如果数据位数少于index位数,通常会用NaN代替;反之会报错;
data = {
'user' : ['zszxz','craler','rose'],
'sequence' : [100, 101, 102],
'age' : [18,18,18]
}
index = ['user1','user2','user3']
frame = pd.DataFrame(data,index)
print(frame)
输出
user sequence age
user1 zszxz 100 18
user2 craler 101 18
user3 rose 102 18
2.3指定列创建
可以使用已有的DataFrame进行二次创建,此时指定列后生成新的DataFrame会按照columns 指定的顺序创建;
data = {
'user' : ['zszxz','craler','rose'],
'sequence' : [100, 101, 102],
'age' : [18,18,18]
}
frame = pd.DataFrame(data)
reframe = pd.DataFrame(data,columns=['sequence', 'user'])
print(reframe)
输出
sequence user
0 100 zszxz
1 101 craler
2 102 rose
2.4 使用numpy创建
简便的方式就是使用numpy来创建数据
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
print(frame)
输出
zszxz craler rose
user1 0 1 2
user2 3 4 5
user3 6 7 8
2.5 字典方式创建
如下的字典方式创建,外层的字典的键会作为DataFrame 的列 ;内层字典的键会作为 DataFrame 的索引,内存的字典的值作为对应的列和索引位置上的值;
dic = {
'user1':{'zszxz':0,'craler':1,'rose':2},
'user2':{'zszxz':3,'craler':4,'rose':5},
'user3':{'zszxz':6,'craler':7,'rose':8}
}
frame = pd.DataFrame(dic)
print(frame)
输出
user1 user2 user3
zszxz 0 3 6
craler 1 4 7
rose 2 5 8
三 取列
3.1 取所有值
使用 DataFrame.values
会获得所有 的values 值;
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
print(frame.values)
输出
[[0 1 2]
[3 4 5]
[6 7 8]]
3.2取所有索引
使用 DataFrame.index
会获得所有 的index ;
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
print(frame.index)
输出
Index(['user1', 'user2', 'user3'], dtype='object')
3.3 取所有列
使用 DataFrame.columns
会获得所有 的columns
;
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
print(frame.columns)
输出
Index(['zszxz', 'craler', 'rose'], dtype='object')
3.4 取特定列
想要获取 DataFrame 中某列的数据(Series)可以使用 DataFrame.列名
或者 DataFrame['列名']
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
print(frame.zszxz)
输出
user1 0
user2 3
user3 6
Name: zszxz, dtype: int32
四 赋值
4.1 简单赋值
赋值操作与数组操作类似,按照 frame['zszxz'] = 666
所示赋值意指将 zszxz 这列的数据都赋值为666;
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame['zszxz'] = 666
print(frame)
输出
zszxz craler rose
user1 666 1 2
user2 666 4 5
user3 666 7 8
4.2 精确赋值
想要对某列的每个元素赋值,最好的方式就是使用Series,必须指出index,如果data数据位数不够则会使用NaN代替空值;
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
ser = pd.Series(data = [1,2,3],index=index)
frame['zszxz'] = ser
print(frame)
输出
zszxz craler rose
user1 1 1 2
user2 2 4 5
user3 3 7 8
除了使用Series也可以使用numpy的编排方式;
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame['zszxz'] = np.arange(3)
print(frame)
输出
zszxz craler rose
user1 0 1 2
user2 1 4 5
user3 2 7 8
五 删除
需要删除某列是可以使用def
关键字,比如del frame['rose']
表示删除 rose列的数据;
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
del frame['rose']
print(frame)
输出
zszxz craler
user1 0 1
user2 3 4
user3 6 7
六 取行
要从DataFrame中去出某些行则需要像数组切片一样的使用方式,如下所示中 frame[0:1]
表示起始索引为0,结束索引为1(不包括)的行;
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
print(frame[0:1])
输出
zszxz craler rose
user1 0 1 2
如果需要选择某个特定行中的某列值,按照 frame['zszxz'][0]
方式选取,表示选取列zszxz的第一个位置元素(注意索引是从0开始)
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
print(frame['zszxz'][0])
print(frame['zszxz'][1])
输出
0
3
七 转置
转置意指将行和列对调,其实现方式非常简单,使用 DataFrame .T
属性即可;如下所示中本来列是['zszxz','craler','rose']的 3 * 3 的 矩阵 经过转置后 会变成列是 ['user1','user2','user3'] 的 3 * 3的矩阵;简记就是列和索引对调了;
index = ['user1','user2','user3']
data = np.arange(9).reshape(3,3)
columns = ['zszxz','craler','rose']
frame = pd.DataFrame(data,index,columns)
print(frame.T)
输出
user1 user2 user3
zszxz 0 3 6
craler 1 4 7
rose 2 5 8
八 简单筛选
8.1 大于
示例中使用frame>5
会筛选出所有值大于5的数据,使用 bool类型标识,数据大于5为True, 反之为False;
dic = {
'user1':{'zszxz':0,'craler':1,'rose':2},
'user2':{'zszxz':3,'craler':4,'rose':5},
'user3':{'zszxz':6,'craler':7,'rose':8}
}
frame = pd.DataFrame(dic)
print(frame>5)
输出
user1 user2 user3
zszxz False False True
craler False False True
rose False False True
可以使用上面的条件进行二次筛选,可以获得想要的数据而不是布尔类型表示;不符合的数据使用NaN代替
dic = {
'user1':{'zszxz':0,'craler':1,'rose':2},
'user2':{'zszxz':3,'craler':4,'rose':5},
'user3':{'zszxz':6,'craler':7,'rose':8}
}
frame = pd.DataFrame(dic)
print(frame[frame>5])
输出
user1 user2 user3
zszxz NaN NaN 6
craler NaN NaN 7
rose NaN NaN 8
8.2 判断从属
使用DataFrame.isin()
方法 判定元数是否属于 DataFrame,参数是个数组;
dic = {
'user1':{'zszxz':0,'craler':1,'rose':2},
'user2':{'zszxz':3,'craler':4,'rose':5},
'user3':{'zszxz':6,'craler':7,'rose':8}
}
frame = pd.DataFrame(dic)
print(frame.isin([0,1,2]))
输出
user1 user2 user3
zszxz True False False
craler True False False
rose True False False
同理也可以对上面的过滤条件进行二次筛选 ,不符合的数据使用NaN代替;
dic = {
'user1':{'zszxz':0,'craler':1,'rose':2},
'user2':{'zszxz':3,'craler':4,'rose':5},
'user3':{'zszxz':6,'craler':7,'rose':8}
}
frame = pd.DataFrame(dic)
print(frame[frame.isin([0,1,2])])
输出
user1 user2 user3
zszxz 0 NaN NaN
craler 1 NaN NaN
rose 2 NaN NaN