首页 > 编程语言 >Python数据分析pandas之dataframe初识

Python数据分析pandas之dataframe初识

时间:2023-02-21 10:33:27浏览次数:42  
标签:name no Python age dataframe 003 002 001 pandas


Python数据分析pandas之dataframe初识

声明与简介

pandas是一个基于python的、快速的、高效、灵活、易用的开源的数据处理、分析包(工具)。。pandas构建在numpy之上,它通过DataFrame(数据框)来操作数据。数据框是一个高效的可以指定行和列标签的多维数组,通过这种数据类型可以更方便的操作、分析数据。本文主要介绍DataFrame的初始化和访问、缺失值处理的常见方法。

创建DataFrame

DataFrame可以看作是二维数组的模拟,可以通过行索引和列名对数组进行检索。数据框是二维的,由行和列组成,类似数据库里的二维表的概念(众多行和列组成)。

我们也可以把DataFrame看作是特殊的Numpy数组或者Python字典对象。

DataFrame(二维数组)是有一对排序有序的Series(一维数组)组成的,这里的有序指的是他们有相同的索引。

拼接字典方式的Series

#以学生学号、姓名、年龄的学生信息的DataFrame为例,演示DataFrame与Series的关系。
import pandas as pd
age={
"no_001":28,
"no_002": 32,
"no_003": 19
}
name={
"no_001":"张三",
"no_002": "李四",
"no_003":"王二"

}
df= pd.DataFrame({"name":name,"age":age})
print(df)

#结果
name age
no_001 张三 28
no_002 李四 32
no_003 王二 19

#这里不难发现,Series name和Series age有相同的序列,即索引系统。这里可以理解为记录序号或者学号。

二维Numpy数组

#通过Numpy数组的方式创建以学号为索引,含姓名和年龄的学生信息的数据框
import pandas as pd
df=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003'])
print(df)

#结果
name age
no_001 张三 28
no_002 李四 32
no_003 王二 19

由结构化(体)数组创建

#通过一个结构体将分开的数组串成一个整体。这里的结构体类似于C语言里的Struct,可以理解为一些有意义的个体内容的整合。

import pandas as pd
name=["张三","李四","王二"]
age=[28,32,19]
data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')})
data['name']=name
data['age']=age
#打印结构体的数据内容
print(data)
df=pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])
print(df)

#结果
[('张三', 28) ('李四', 32) ('王二', 19)]
name age
no_001 张三 28
no_002 李四 32
no_003 王二 19

访问DataFrame

字典方式

#该方式主要是指DataFrame是由字典形式的Series组成的,访问元素时可以采用字典方式。
#当前需求是仅访问name列,即显示所有人的姓名

import pandas as pd
age={
"no_001":28,
"no_002": 32,
"no_003": 19
}
name={
"no_001":"张三",
"no_002": "李四",
"no_003":"王二"

}
df= pd.DataFrame({"name":name,"age":age})
print(df['name'],df.name)
#结果
no_001 张三
no_002 李四
no_003 王二
Name: name, dtype: object no_001 张三
no_002 李四
no_003 王二
Name: name, dtype: object

二维Numpy数组

#通过Numpy数组的方式创建以学号为索引,含姓名和年龄的学生信息的数据框
import pandas as pd
df=pd.DataFrame([["张三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003'])
print(df.values)

#结果
[['张三' 28]
['李四' 32]
['王二' 19]]

通过loc或iloc访问

#针对字典方式或二维数组方式创建的DataFrame都可通过loc和iloc方法进行行和列的过滤来访问数据框里的元素。
#通过loc或者iloc访问数据框的内容

import pandas as pd
name=["张三","李四","王二"]
age=[28,32,19]
data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')})
data['name']=name
data['age']=age

df1= pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])

import pandas as pd
df2 = pd.DataFrame([["张三", 28], ["李四", 32], ["王二", 19]], columns=['name', 'age', ],
index=['no_001', 'no_002', 'no_003'])
print(df1.loc['no_001'])
print(df1.loc['no_001']['name'])
print(df2.loc['no_001']['name'])
print(df2.iloc[1])


#结果
name 张三
age 28
Name: no_001, dtype: object
张三
张三
name 李四
age 32
Name: no_002, dtype: object

通过loc或iloc过滤

#针对字典方式或二维数组方式创建的DataFrame都可通过loc和iloc方法进行行和列的过滤来访问数据框里的元素。
#通过loc或者iloc访问带过滤条件的数据框内容,这里仅显示年龄大于30的学生姓名。


import pandas as pd
name=["张三","李四","王二"]
age=[28,32,19]
data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')})
data['name']=name
data['age']=age

df1= pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])

import pandas as pd
df2 = pd.DataFrame([["张三", 28], ["李四", 32], ["王二", 19]], columns=['name', 'age', ],
index=['no_001', 'no_002', 'no_003'])
print(df1.loc[data['age']>30,['name']])
#如果第2行里age大于30那么就显示它的姓名
print(df1.name[df1.iloc[1]['age'] > 30])


#结果
name
no_002 李四
李四

通过loc或iloc切片

#可以通过loc或者iloc对数据框进行切片式访问。
#行切示例,分别以loc或iloc方式仅取出no_002、no_003对应的内容

import pandas as pd
name=["张三","李四","王二"]
age=[28,32,19]
data = np.zeros(3, dtype={'names': ('name', 'age'),'formats': ('U10', 'i4')})
data['name']=name
data['age']=age
df1= pd.DataFrame(data,columns=['name','age'],index=['no_001','no_002','no_003'])

import pandas as pd
df2 = pd.DataFrame([["张三", 28], ["李四", 32], ["王二", 19]], columns=['name', 'age', ],
index=['no_001', 'no_002', 'no_003'])
print(df1.loc['no_002':'no_003'])
print(df2.iloc[0:1])

#结果
name age
no_002 李四 32
no_003 王二 19
name age
no_001 张三 28

DataFrame处理缺失值

None填充缺失值

该方式用None来补充缺失值,因为None是空对象,而Numpy、Series、DataFrame都属于Padans且继承自Object对象,所以可以被赋值为None,即空对象。

#利用None作为空元素填充到数据框里。
import pandas as pd
df2 = pd.DataFrame([["张三", 28], ["李四", 32], [None, 19]], columns=['name', 'age',],index=['no_001', 'no_002', 'no_003'])
print(df2)
#结果
name age
no_001 张三 28
no_002 李四 32
no_003 None 19
#注:None不可以参与任何的元素运算,比如None+3是非法的。

NaN填充缺失的数值

#通过numpy的NAN方法对缺失、空的数值型进行填充。
import pandas as pd df2 = pd.DataFrame([["张三", 28], ["李四", 32], ["王二",np.nan]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003']) print(df2)
print(df2['age'].sum()) #结果
name age no_001 张三 28.0 no_002 李四 32.0 no_003 王二 NaN
60.0

#1这里的np.nan是float类型。
#2由此可见DataFrame做列的sum时会将NaN值认为是0.0。

#这里的NAN可以做运算,比如NaN+3还是NaN。示例如下:
import numpy as np vals2 = np.array([1,3, 4,np.nan]) print(vals2.sum())
#结果
nan

Null notnull判断空值

#1 通过isnull来判断数据框里的列是否有None或者nan的情况
import pandas as pd
df2 = pd.DataFrame([["张三", None], ["李四",32 ], ["王二",np.nan]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003'])
print(df2.isnull())
#结果
name age
no_001 False True
no_002 False False
no_003 False True
#2 同理利用notnull,提取age列不为空的数据。
import pandas as pd
df2 = pd.DataFrame([["张三", None], ["李四",32 ], ["王二",np.nan]], columns=['name', 'age', ],index=['no_001', 'no_002', 'no_003'])
print(df2[df2['age'].notnull()])
#结果
name age
no_002 李四 32.0

用所在列前值填充空数据

#此种方式是用ffill方法即当前列里为空元素的前一个元素来补充当前为空的元素。
import pandas as pd
df2 = pd.DataFrame([["张三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003'])
print(df2.fillna(method='ffill'))
#结果,不难发现no_002的name被no_001的name填充,同理no_003的age被no_002的填充。
name age score level
no_001 张三 28.0 80 1
no_002 张三 32.0 90 2
no_003 王二 32.0 99 1

用所在列后值填充空数据

#此种方式是用bfill方法即当前列里为空元素的前一个元素来补充当前为空的元素。
import pandas as pd
df2 = pd.DataFrame([["张三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003'])
print(df2.fillna(method='bfill'))
#结果,不难发现这里no_002的name被no_003的name填充,而因为no_003是最后的记录,所以无法再被填充,所以age只能还是NaN。
name age score level
no_001 张三 28.0 80 1
no_002 王二 32.0 90 2
no_003 王二 NaN 99 1

用固定值填充空数据

#此种方式即fillna时指定固定的值,比如0或者列的均值等。
import pandas as pd
df2 = pd.DataFrame([["张三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003'])
print(df2.fillna(0))
#结果
name age score level
no_001 张三 28.0 80 1
no_002 0 32.0 90 2
no_003 王二 0.0 99 1

以列方向删除空值

#这种方式从列这个角度(axis='columns')去删除为None或者Nan的数据,但凡某一列含有空就删除该列,输出列数取决于不含空的列的个数。
import pandas as pd
df2 = pd.DataFrame([["张三", 28,80], [None,32,90 ], ["王二",np.nan,99]], columns=['name', 'age','score' ],index=['no_001', 'no_002', 'no_003'])
print(df2.dropna(axis='columns'))
#结果
score
no_001 80
no_002 90
no_003 99
#注:axis='columns'等价于axis=1

以行方向删除空值

#这种方式从行这个角度(axis='rows')去删除为None或者Nan的数据,但凡某一行含有空就删除该行,输出列数与原数据的列数一致或者为空。
import pandas as pd
df2 = pd.DataFrame([["张三", 28,80], [None,32,90 ], ["王二",np.nan,99]], columns=['name', 'age','score' ],index=['no_001', 'no_002', 'no_003'])
print(df2.dropna())
print(df2.dropna(axis='rows'))
#结果
name age score
no_001 张三 28.0 80
#注 1注:axis='rows'等价于axis=0
#2如果不指定axis那么就会从行、列方向做删除操作。

以最小非空阀值删除空值

#该方式是指定thresh参数以限定行或者列的最小非空的个数,即最小非空阈值。
#当前示例有姓名、年龄、分数、等级4列,3条数据,这里因为设置了最小非空阈值,所以输出结果里有的列是None或者Nan是正常的。
import pandas as pd
df2 = pd.DataFrame([["张三", 28,80,1], [None,32,90,2 ], ["王二",np.nan,99,1]], columns=['name', 'age','score','level'],index=['no_001', 'no_002', 'no_003'])
print(df2.dropna())
print(df2.dropna(axis='rows',thresh=3))
#结果
name age score level
no_001 张三 28.0 80 1
no_002 None 32.0 90 2
no_003 王二 NaN 99 1

标签:name,no,Python,age,dataframe,003,002,001,pandas
From: https://blog.51cto.com/u_15080860/6075986

相关文章

  • Python字符串操作
    1.字符串索引例:data='abcd'print(data[3])运行结果:d0123正索引-4-3-2-1负索引2.字符串切片data[:]中括号中冒号的左边是第一刀右边是第二刀例:data='......
  • 为啥Python多线程爬虫跑的慢?
    单线程和多线程进行数据抓取结果还是大有不同的,但是要值得注意的事,如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的......
  • Python命令行工具——iPython安装与使用
    一、安装iPython通过pipinstallipython的方式来安装ipython插件如果你使用的是Mac电脑并安装了Python3,那么你也许需要输入pip3installipython如果执行报错,找不到pip......
  • 加密,各种加密,耙梳加密算法(Encryption)种类以及开发场景中的运用(Python3.10)
    不用说火爆一时,全网热议的Web3.0区块链技术,也不必说诸如微信支付、支付宝支付等人们几乎每天都要使用的线上支付业务,单是一个简简单单的注册/登录功能,也和加密技术脱不了干......
  • Python多线程如何保证数据安全
    之前有一篇文章分享了有关Python多线程的一次基础语法以及GIL的相关概念,今天我们重点讲解多线程的数据安全问题。数据安全问题我们首先来举一个例子,这里定义两个函数,一个......
  • python * 和 ** 的理解
    数学计算、获取参数、通配符数学计算乘法计算a*b立方计算a**b获取参数表示函数的可变参数例如func(*agr)实际调用可以在函数写入多个参数*func(a,b......
  • [oeasy]python0089_大型机的衰落_Dec小型机崛起_PDP_VAX网络
    编码进化回忆上次内容上次回顾了计算机存储单位的演变最小的读写单位是bit8-bit固定下来成为了字节(Byte)位数容量8-bit1Byte1024Byte......
  • Python 数据分析
    PrerequisitePS:只是做部分记录,具体的内容全记载在语雀,但不方便放出来NumPy是一个用于数值运算的Python库,专门对数值运算进行优化,最大的优势是运行高效。Matplotlib......
  • 在python中将4维数组中获取3维数组的方法
    在python中将4维数组中获取3维数组的方法得到了这个数组,它的大小是(26,16,16,16)。我需要绘制最后3个维度与不同参数的关系图,但我不清楚如何在不造成灾难的情况下切割第一个......
  • 2.1python认知
    2.1python认知####(1)python简介89年开发的语言,创始人范罗苏姆(GuidovanRossum),别称:龟叔(Guido).python具有非常多并且强大的第三方库,使得程序开发......