技术标签: pandas python 数据分析 Python学习笔记
先生成测试数据,存放学生的成绩信息:
import copy
import pandas as pd
data = pd.DataFrame({
'name':['Lindsay','Chris','Ambe','Delia','Ula'],
'score':['55分','66分','77分','88分','99分'],
'course_id':[1,1,1,1,1]})
data
name | score | course_id | |
---|---|---|---|
0 | Lindsay | 55分 | 1 |
1 | Chris | 66分 | 1 |
2 | Ambe | 77分 | 1 |
3 | Delia | 88分 | 1 |
4 | Ula | 99分 | 1 |
直接暴力修改,就是直接把所有列名进行重置,赋予新的列名。
这种方式必须把所有的列名都写上(不修改名称的也要写),而且顺序和数量都必须和原来的数据表保持一致。
如:把 ‘course_id’ 改为 ‘课程id’。
data_1 = copy.deepcopy(data) # 将data深复制到data_1,防止data的值被修改
data_1.columns = ['name', 'score', '课程id']
data_1
name | score | 课程id | |
---|---|---|---|
0 | Lindsay | 55分 | 1 |
1 | Chris | 66分 | 1 |
2 | Ambe | 77分 | 1 |
3 | Delia | 88分 | 1 |
4 | Ula | 99分 | 1 |
显然,当数据表中有很多列时,这种方式并不是明智之举。
rename()函数可以直接指定需要更改的原列名和新列名,当有多列需要更改时,用字典的方式提供列名更改信息。
参数格式:
DataFrame.rename( columns = { ‘原列名1’:‘新列名1’,…, ‘原列名n’:‘新列名n’ }, inplace = False )
inplace=False:表示不直接在原始数据上修改列的名称,而是生成一个副本,可以赋值给新的对象,inplace默认为False。
inplace=True:直接在原始数据上修改列的名称。
data_2=data.rename(columns={
'name':'姓名', 'score':'成绩'})
data_2
姓名 | 成绩 | course_id | |
---|---|---|---|
0 | Lindsay | 55分 | 1 |
1 | Chris | 66分 | 1 |
2 | Ambe | 77分 | 1 |
3 | Delia | 88分 | 1 |
4 | Ula | 99分 | 1 |
在工作中,我们有时候需要对数据表的列进行重排序。
我们可以根据我们的需要,按照指定的顺序读取列,然后赋值给新的变量。
如:将 ‘course_id’ 列显示到最前面。
data_3 = data[['course_id','name','score']] # 根据需要,改变列的顺序
data_3
course_id | name | score | |
---|---|---|---|
0 | 1 | Lindsay | 55分 |
1 | 1 | Chris | 66分 |
2 | 1 | Ambe | 77分 |
3 | 1 | Delia | 88分 |
4 | 1 | Ula | 99分 |
当我们读取到的原始数据中,有些列是我们不需要的时。
我们可以从以下两个方面来处理。
如:删除 ‘course_id’ 列。
data_4 = data[['name','score']]
data_4
name | score | |
---|---|---|
0 | Lindsay | 55分 |
1 | Chris | 66分 |
2 | Ambe | 77分 |
3 | Delia | 88分 |
4 | Ula | 99分 |
备注:这种方式看上去
是删除了 ‘course_id’ 列,其实只是让新的变量中不存放’course_id’ 列的值,原始数据并没有发生改变。
data_5 = copy.deepcopy(data)
del data_5['course_id']
data_5
name | score | |
---|---|---|
0 | Lindsay | 55分 |
1 | Chris | 66分 |
2 | Ambe | 77分 |
3 | Delia | 88分 |
4 | Ula | 99分 |
备注:del 方法一次只能删除一列,不能删除多列,而且是直接对原始数据进行删除。
drop()方法可以通过直接指定索引或列名,删除行或列。
参数格式:
DataFrame.drop(labels=None,axis=0,index=None,columns=None,inplace=False)
data.drop(columns='course_id', axis=1, inplace=True)
data
name | score | |
---|---|---|
0 | Lindsay | 55分 |
1 | Chris | 66分 |
2 | Ambe | 77分 |
3 | Delia | 88分 |
4 | Ula | 99分 |
备注:指定删除的列名为 ‘course_id’,axis=1代表删除列,inplace=True 代表直接在原始数据上进行删除。
drop() 函数可以同时删除多列。
如:同时删除 ‘name’ 和 ‘score’ 列的写法:
data.drop(columns=['name','score'], axis=1)
0 |
---|
1 |
2 |
3 |
4 |
在 DateFrame 类型的数据后面,直接跟上新的列名,然后赋值。
这种方式会直接修改 DateFrame 的值,在该 DateFrame 类型的数据后面,新增一列。
格式为:
DateFrame[‘新列名’] = ‘新列值’
如:现在学生的成绩是 “ str ” 类型,而且带有汉字“分”,不方便计算。
我们需要新建一列,提取出成绩中的数值部分。
data['score1'] = data['score'].str.replace('分','').astype('int32')
# 将'分'替换为''(空字符串),即删除'分'字,并转换为int类型
data
name | score | score1 | |
---|---|---|---|
0 | Lindsay | 55分 | 55 |
1 | Chris | 66分 | 66 |
2 | Ambe | 77分 | 77 |
3 | Delia | 88分 | 88 |
4 | Ula | 99分 | 99 |
注:该方法不可以选择插入新列的位置,默认为最后一列。
如果新增的一列值相同,直接为其赋值一个常量即可;
如果插入值不同,为列表格式,需与已有列的行数长度一致,如上面例子中原来列为5行,新增列也必须有5个值。
前面直接赋值的方法只能在原始数据的最后位置插入一列数据。
如果想要在任意位置插入一列,就需要用到insert()函数。
语法格式如下:
DataFrame.insert(loc, column, value,allow_duplicates = False)
参数:
loc:必要字段,int类型数据,表示插入新列的列位置,原来在该位置的列将向右移。
column:必要字段,插入新列的列名。
value:必要字段,新列插入的值。如果仅提供一个值,将为所有行设置相同的值。可以是int,string,float等,甚至可以是series /值列表。
allow_duplicates:可选字段。布尔值,用于检查是否存在具有相同名称的列。默认为False,不允许与已有的列名重复。
如:我们在第 0 列的位置插入新的一列,列名为 test,值为3。
data.insert(loc=0, column='test', value=3)
data
test | name | score | score1 | |
---|---|---|---|---|
0 | 3 | Lindsay | 55分 | 55 |
1 | 3 | Chris | 66分 | 66 |
2 | 3 | Ambe | 77分 | 77 |
3 | 3 | Delia | 88分 | 88 |
4 | 3 | Ula | 99分 | 99 |
为了不影响后面的使用,我们把 ‘test’ 列删除。
data.drop('test',axis=1,inplace=True)
data
name | score | score1 | |
---|---|---|---|
0 | Lindsay | 55分 | 55 |
1 | Chris | 66分 | 66 |
2 | Ambe | 77分 | 77 |
3 | Delia | 88分 | 88 |
4 | Ula | 99分 | 99 |
df.apply()方法可以为我们添加条件列提供支持。
apply()函数主要用于对 DataFrame 中的 某一行或列 中的元素执行 相同的函数操作 。
参数格式:
DataFrame.apply(函数名, axis=0/1)
axis=0:将函数操作应用到行上; axis=1:将函数操作应用到列上。
如:我们定义一个函数,来对成绩进行分级。
score<60 — 不及格
60<=score<70 — 及格
70<=score<80 — 中等
80<=score<90 — 良好
score>=90 — 优秀
# 自定义成绩分级函数
def score_classify(df):
if df['score1']<60:
return '不及格'
elif df['score1']<70:
return '及格'
elif df['score1']<80:
return '中等'
elif df['score1']<90:
return '良好'
else:
return '优秀'
注意:定义函数时,将 Dataframe 类型的数据作为参数传入,然后在函数体内部对 df[‘score1’] 进行判断。
# 使用apply()方法使 “score1”列的所有元素,执行score_classify()函数
data['成绩分级']=data.apply(score_classify, axis=1) # axis=1,将函数操作应用到列上
data
name | score | score1 | 成绩分级 | |
---|---|---|---|---|
0 | Lindsay | 55分 | 55 | 不及格 |
1 | Chris | 66分 | 66 | 及格 |
2 | Ambe | 77分 | 77 | 中等 |
3 | Delia | 88分 | 88 | 良好 |
4 | Ula | 99分 | 99 | 优秀 |
assign()方法可以同时新增多列,并以副本的方式返回 DataFrame ,不会直接修改原始数据。
尽管 df[“column”] 的方式新增一列数据已经很方便,但是在不需要实际生成该列,又可以调用某列数据时,df.assign()方法更具优势。
assign()只能使用在 DataFrame 对象上,语法为:
DataFrame.assign(列名1=列值1, …,列名n=列值n)
如:为 data 新增两列,值分别为1、2。
test_data=data.assign(column1=1, column2=2)
test_data
name | score | score1 | 成绩分级 | column1 | column2 | |
---|---|---|---|---|---|---|
0 | Lindsay | 55分 | 55 | 不及格 | 1 | 2 |
1 | Chris | 66分 | 66 | 及格 | 1 | 2 |
2 | Ambe | 77分 | 77 | 中等 | 1 | 2 |
3 | Delia | 88分 | 88 | 良好 | 1 | 2 |
4 | Ula | 99分 | 99 | 优秀 | 1 | 2 |
df.assign()方法是生成副本,可以赋值给新的变量,但不会改变原来 DataFrame 的值。
如,我们来看 data 的值,还是原来的4列。
data
name | score | score1 | 成绩分级 | |
---|---|---|---|---|
0 | Lindsay | 55分 | 55 | 不及格 |
1 | Chris | 66分 | 66 | 及格 |
2 | Ambe | 77分 | 77 | 中等 |
3 | Delia | 88分 | 88 | 良好 |
4 | Ula | 99分 | 99 | 优秀 |
按条件先选择数据,然后对这部分数据赋值给新列。
格式为:
DataFrame.loc[ 条件判断, ‘新列名’] = ‘新列的值’
data.loc[ data['score1']<60 , '成绩分级1'] = '不及格'
data.loc[ data['score1']>=60 , '成绩分级1'] = '及格'
data.loc[ data['score1']>=70 , '成绩分级1'] = '中等'
data.loc[ data['score1']>=80 , '成绩分级1'] = '良好'
data.loc[ data['score1']>=90 , '成绩分级1'] = '优秀'
data
name | score | score1 | 成绩分级 | 成绩分级1 | |
---|---|---|---|---|---|
0 | Lindsay | 55分 | 55 | 不及格 | 不及格 |
1 | Chris | 66分 | 66 | 及格 | 及格 |
2 | Ambe | 77分 | 77 | 中等 | 中等 |
3 | Delia | 88分 | 88 | 良好 | 良好 |
4 | Ula | 99分 | 99 | 优秀 | 优秀 |
注意:使用 df[条件判断] 和 df.loc[条件判断] 都可以对 DataFrame 类型的数据进行筛选。
但是 df[条件判断] 的方式不能直接新建条件列,但 df.loc[条件判断] 的方式可以。
如:
data[data['score1']>60]
name | score | score1 | 成绩分级 | 成绩分级1 | |
---|---|---|---|---|---|
1 | Chris | 66分 | 66 | 及格 | 及格 |
2 | Ambe | 77分 | 77 | 中等 | 中等 |
3 | Delia | 88分 | 88 | 良好 | 良好 |
4 | Ula | 99分 | 99 | 优秀 | 优秀 |
data.loc[data['score1']>60]
name | score | score1 | 成绩分级 | 成绩分级1 | |
---|---|---|---|---|---|
1 | Chris | 66分 | 66 | 及格 | 及格 |
2 | Ambe | 77分 | 77 | 中等 | 中等 |
3 | Delia | 88分 | 88 | 良好 | 良好 |
4 | Ula | 99分 | 99 | 优秀 | 优秀 |
data.[data['score1']>60 , '新建列1'] = '及格' # 报错
data
File "<ipython-input-19-a34fe8ac325b>", line 1
data.[data['score1']>60 , '新建列1'] = '及格' # 报错
^
SyntaxError: invalid syntax
data.loc[data['score1']>60 , '新建列2'] = '及格' # 成功新建条件列
data
name | score | score1 | 成绩分级 | 成绩分级1 | 新建列2 | |
---|---|---|---|---|---|---|
0 | Lindsay | 55分 | 55 | 不及格 | 不及格 | NaN |
1 | Chris | 66分 | 66 | 及格 | 及格 | 及格 |
2 | Ambe | 77分 | 77 | 中等 | 中等 | 及格 |
3 | Delia | 88分 | 88 | 良好 | 良好 | 及格 |
4 | Ula | 99分 | 99 | 优秀 | 优秀 | 及格 |
文章浏览阅读257次。使用官方提供的脑PET数据集,构建逻辑回归模型来进行脑PET图像的疾病预测,数据集被分为两类,分别为轻度认知障碍(MCI)患者的脑部影像数据和健康人(NC)的脑部影像数据,图像数据格式为nii,因此本赛题可抽象为一个二分类问题。nii是一种常用的医学图像数据格式,主要用于存储和交换神经影像数据。以下是一些主要特点:1.主要用于存储3D(三维)医学图像数据,如MRI(磁共振成像)和CT(计算机断层扫描)图像。2.支持多种数据类型,使得其可以支持不同类型的数据处理和分析。_逻辑回归需要训练很多轮么
文章浏览阅读1.2k次,点赞31次,收藏26次。增强现实通常被视为一个利基领域。然而,在过去的两年里,它已经到了一个成熟的阶段,应该在一般的营销堆栈中进行考虑。正如我们所看到的,这个市场是巨大的,而且随着主要参与者向这项技术投入大量投资,它只会继续增长。从苹果到Meta,大公司都相信身临其境的未来,而想要获得成功的营销人员和创意人员也加入了进来。本文第三章,最佳设计实践除了深入讨论AR设计的原则外,还全面推荐了AI设计工具。旨在帮助读者的AI作品脱颖而出。
文章浏览阅读473次。OSI七层网络模型由下至上为1至7层,分别为:物理层(Physical layer),数据链路层(Data link layer),网络层(Network layer),传输层(Transport layer),会话层(Session layer),表示层(Presentation layer),应用层(Application layer)。1.1 应用层,很简单,就是应用程序。这一层负责_usage: ./tcp_client hostname
文章浏览阅读2.8k次。环境准备安装 maven 安装 java 环境[root@cicd-nexus ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz[root@cicd-nexus ~]# tar xf apache-maven-3.6.3-bin.tar.gz -C /usr/local/[root@cicd-nexus ~]# tar xf _maximum component age
文章浏览阅读1.6k次。使用js-xlsx handsontable 可以把本地excel 解析到网页上,然后分批次传入后台。在chrome 下 可以参考 https://github.com/SheetJS/js-xlsx 【Browser file upload form element】但需要使用FileReader api 这个只有ie10 才开始支持。兼容ie9 ,ie9需要通过flash 来支持..._js 导excel 分批写入
文章浏览阅读2.5k次。在wxWidgets中,想要通过其本身的控件来实现图片+文件的按钮,貌似不太容易做到。但是可以通过重载wxControl来自绘图片+文件按钮。下面给出的是已经封装好的按钮类:wxBitmapButtonEx.h#ifndef _BITMAP_BUTTON_EX_H#define _BITMAP_BUTTON_EX_H#include "wx/wx.h"enum eBitm_wxwidgets 中文按钮
文章浏览阅读847次。invalidate()与postInvalidate()都用于刷新View,主要区别是invalidate()在主线程中调用,若在子线程中使用需要配合handler;而postInvalidate()可在子线程中直接调用。postInvalidate它是向主线程发送个Message,然后handleMessage时,调用了invalidate()函数。(系统帮我们 写好了 Handle..._postinvalidate和invalidate的区别
文章浏览阅读9.1k次。excel数据进行分类汇总的步骤在做分类汇总前,我们需要对数据先进行排序,否则分类汇总无法进行。得到排序后的表格。点击上方工具栏中的“数据”→“分类汇总”。在弹出的对话框中选择“分类字段”→“汇总方式”→“决定汇总项”。点击确定出现数据汇总结果。Excel表格中求差函数公式使用的方法第一步:打开Excel表格,单击第一排,第三个“单元格”,也就是C1,在C1中输入“=A1-B1”;第二步:这个公式..._表格求差公式
文章浏览阅读1.5w次,点赞49次,收藏169次。前言好激动,断断续续装了两三天才装上,踩了好多坑。这里把成功安装的步骤详细写下来,如果有小伙伴需要,可以尝试一下,但我不能保证你也可以装好。首先说一下我的各个版本(不谈版本的安装教程都是耍流氓!)是用虚拟机软件:VirtualBOX6.1.30系统版本:ubuntu-20.04.3-desktop-amd64(最小安装模式,中文)OpenCV版本:4.5.5安装时间:2022.2.11下面是步骤1、进入OpenCV的官方下载地址Releases - OpenCV,下载So_无法定位软件包 libgazebo-dev
文章浏览阅读320次,点赞6次,收藏10次。/是上一个的进化版,相邻的可以一样但是不能都是绿色,注意条件;~~~//仅当笔者个人备忘录使用。
文章浏览阅读6.7k次。由于Install Intel x86 Emulator Accelerator (HAXM installer) (revision: 7.6.5)安装失败,导致我的安卓虚拟机无法启动。解决办法有一下几种:1.开机进入BIOS打开Virtual虚拟化功能,然后进入Androidstudio 的SDK manager里面安装HAXM2.关闭系统中的Hyper-v,进入控制面板的程序和功能,将Hyper-v去选即可。3.如果前面的方法都不行,那么建议你重新下载AndroidStudio最新版进行安装_intel x86 emulator
文章浏览阅读1.1w次,点赞2次,收藏15次。 每一种语言都有一组基本的语法约定,POWERBUILDER也不例外。 (1)断行、续行与多条语句 通常情况下,powerbuilder的一条语句是写到一行上的,该条语句在书写完毕之后,按键转到下一行,开始写下一句的内容。也就是说,在PowerBuilder中,使用键作为一行的结束。在PowerBuilder语句比较长的情况下,为了方便阅读,可以使用续行符号把一条语句写到几_powerbuilder