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
posted @ 2020-05-07 15:01  知识追寻者  阅读(145)  评论(0编辑  收藏  举报