pandas 对列的相关操作_pandas 列操作-程序员宅基地

技术标签: pandas  python  数据分析  Python学习笔记  

pandas 对列的相关操作

先生成测试数据,存放学生的成绩信息:

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

1.修改列名

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

显然,当数据表中有很多列时,这种方式并不是明智之举。

2.指定修改列名rename()

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

2.修改列的顺序

在工作中,我们有时候需要对数据表的列进行重排序。

我们可以根据我们的需要,按照指定的顺序读取列,然后赋值给新的变量

如:将 ‘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分

3.删除列

当我们读取到的原始数据中,有些列是我们不需要的时。

我们可以从以下两个方面来处理。

  • 1.读取数据的时候只读取需要的列,不需要的列就不读取,然后赋值给新的变量;
  • 2.使用 del 方法删除列(只能删除单列);
  • 3.使用 drop() 函数删除列(可以删除多列)。

如:删除 ‘course_id’ 列。

方法1:只读取需要的列

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’ 列的值,原始数据并没有发生改变。

方法2:del方法删除列

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 方法一次只能删除一列,不能删除多列,而且是直接对原始数据进行删除

方法3:使用 drop() 函数删除列

drop()方法可以通过直接指定索引或列名,删除行或列。

参数格式:

DataFrame.drop(labels=None,axis=0,index=None,columns=None,inplace=False)

  • labels:接收字符串或列表。代表删除的行或列的标签,无默认值。
  • axis:接收0或1。代表操作的轴向,0代表删除行,1代表删除列,默认为0。
  • index:接收字符串或列表。代表删除的行的索引index,无默认值。
  • columns:接收字符串或列表。代表删除的列的名称,无默认值。
  • inplace:接收boolean。代表操作是否对原始数据生效,默认为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

3.新建列

1.直接赋值

在 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个值。

2.insert()函数

前面直接赋值的方法只能在原始数据的最后位置插入一列数据

如果想要在任意位置插入一列,就需要用到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

3.df.apply()方法

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 优秀

4.df.assign()方法

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 优秀

5.使用loc[]方法按按条件赋值

按条件先选择数据,然后对这部分数据赋值给新列。

格式为:

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 优秀 优秀 及格
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lengxuan001/article/details/126380155

智能推荐

监听网络变化--含7.0以上适配_android.net.conn.connectivity_change-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏7次。我们知道最早监听网络变化,是通过广播,静态或动态注册广播,处理"android.net.conn.CONNECTIVITY_CHANGE"这个action就可以了intent就可以了。我们发现"android.net.conn.CONNECTIVITY_CHANGE"这个action已经加了注解@Deprecated,不推荐使用了。根据注释说明,7.0及以上静态注册广播(manifest中)..._android.net.conn.connectivity_change

计算机学习目标_bytetrack+yolov5 c++-程序员宅基地

文章浏览阅读291次。开个坑_bytetrack+yolov5 c++

fatal error: filesystem: 没有那个文件或目录_fatal error: filesystem: no such file or directory-程序员宅基地

文章浏览阅读4.8k次,点赞12次,收藏39次。fatal error: filesystem: 没有那个文件或目录_fatal error: filesystem: no such file or directory

2020起重机械指挥作业考试题库及起重机械指挥模拟考试系统_换算英制直径5分钢丝绳为公制多少毫米?()。-程序员宅基地

文章浏览阅读1k次。题库来源:安全生产模拟考试一点通公众号小程序2020起重机械指挥作业考试题库及起重机械指挥模拟考试系统,包含起重机械指挥作业考试题库答案解析及起重机械指挥模拟考试系统练习。由安全生产模拟考试一点通公众号结合国家起重机械指挥考试最新大纲及起重机械指挥考试真题出具,有助于起重机械指挥考试试题考前练习。1、【判断题】指挥人员负责对可能出现的事故采取必要的防范措施。(√)2、【判断题】手势信号包括通用手势信号、专用手势信号和其它指挥信号。()(×)3、【判断题】吊装用的短环链,不..._换算英制直径5分钢丝绳为公制多少毫米?()。

大数据应用丨大数据时代的医学公共数据库与数据挖掘技术简介_dryad数据库-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏25次。本文我们将介绍几种数据库和数据挖掘技术,帮助临床研究人员更好地理解和应用数据库技术。数据挖掘技术可以从大量数据中寻找潜在有价值的信息,主要分为数据准备、数据挖掘、以及结果表达和分析。数据库技术是研究、管理和应用数据库的一门软件科学。通过研究数据库的结构、存储、设计、管理和应用的基本理论和实现方法,对数据库中的数据进行处理和分析。_dryad数据库

随便推点

SpringBoot整合Elastic-job实现_springboot + elasticjob-程序员宅基地

文章浏览阅读3.1k次,点赞3次,收藏13次。SpringBoot整合Elastic-job实现【基本整合】:原理参考:Elastic-Job原理(1)引用pom依赖:<dependency> <groupId>com.dangdang</groupId> <artifactId>elastic-job-lite-core</artifactId> <..._springboot + elasticjob

Attensleep:一种基于注意力的单通道EEG睡眠分期深度学习方法_an attention-based deep learning approach for slee-程序员宅基地

文章浏览阅读791次。AttenSleep 基于注意力的深度学习架构从单通道EEG信号中进行睡眠阶段分类从基于多分辨率卷积神经网络( MRCNN )和自适应特征重标定( AFR )的特征提取模块入手。MRCNN可以提取低频和高频特征,而AFR可以通过建模特征之间的相互依赖关系来提高提取特征的质量。第二个模块是时间上下文编码器( TCE ),它利用多头注意力机制来捕获提取特征之间的时间依赖关系。特别地,多头注意力利用因果卷积对输入特征中的时间关系进行建模。使用三个公共数据集来评估提出的AttnSleep模型的性能。_an attention-based deep learning approach for sleep stage classification wit

Myeclipse技巧-程序员宅基地

文章浏览阅读71次。在了解MyEclipse使用技巧之前我们来看看MyEclipse是什么呢?简单而言,MyEclipse是Eclipse的插件,也是一款功能强大的J2EE集成开发环境,支持代码编写、配置、测试以及除错。下面让我们看看MyEclipse使用技巧的具体内容。MyEclipse使用技巧第一步: 取消自动validationvalidation有一堆,什么xml、jsp、jsf..._myeclipse是什么

c语言统计数组每个数出现的次数,统计数组中某个元素出现的次数和重复的次数...-程序员宅基地

文章浏览阅读8.9k次。//出现的次数function times(arr){var m=0,times=0;//m是数组中的元素,times用来统计出现的次数// for循环遍历arr数组for(var i=0;iif(arr[i]==m){times++;//数组中有相同值就加1}}return times;console.log(times);//这是打印出的出现的次数}times([0, 1, 2, 0, 1, ..._c语言统计数组中每个数字出现的次数

Jmeter连接InfluxDB2.0.4_influxdborganization jmeter-程序员宅基地

文章浏览阅读2.5k次,点赞5次,收藏14次。Jmeter连接InfluxDB2.0.4问题描述:在用Jmeter+InfluxDB构建监控时,因为docker构建的InfluxDB的版本是2.0.4,按照网上的教程进行后端监听器的填写,但是一直出现错误提示401等问题。网上的教程大多是1.X版本的,怀疑是数据库版本不一致导致的数据无法写入,通过调研,问题已解决。以下为配置方法。一、InfluxDB搭建完成后,查看Organization和Bucket名称,这里是ORZ_test和bucket_nameOrganization在这里我的理解_influxdborganization jmeter

关于第三方支付,看这篇文章就够了!-程序员宅基地

文章浏览阅读1.6k次。目录 目录 1、第三方支付概述 2、第三方支付起源 PayPal 支付宝 3、牌照发放 4、支付牌照 5、第三方支付参与者 6、第三方支付行业监管 监管意图对第三方支付可能产生的影响..._第三方支付本行对本行的费用

推荐文章

热门文章

相关标签