pandas删除行删除列增加行增加列的实现


Posted in Python onJuly 06, 2019

创建df:

>>> df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('ABCD'), index=list('1234'))

>>> df

  A  B  C  D

1  0  1  2  3

2  4  5  6  7

3  8  9 10 11

4 12 13 14 15

1,删除行

1.1,drop

通过行名称删除:

df = df.drop(['1', '2'])      # 不指定axis默认为0

df.drop(['1', '3'], inplace=True)

通过行号删除:

df.drop(df.index[0], inplace=True)    # 删除第1行
df.drop(df.index[0:3], inplace=True)   # 删除前3行
df.drop(df.index[[0, 2]], inplace=True) # 删除第1第3行

1.2,通过各种筛选方法实现删除行

详见pandas“选择行单元格,选择行列“的笔记

举例,通过筛选可以实现很多功能,例如要对某行数据去重,可以获取去重后的index列表后,使用loc方法:

>>> df.loc['2','B']=9

>>> df

  A  B  C  D

1  0  1  2  3

2  4  9  6  7

3  8  9 10 11

4 12 13 14 15

>>> chooses = df['B'].drop_duplicates().index

>>> df.loc[chooses]

  A  B  C  D

1  0  1  2  3

2  4  9  6  7

4 12 13 14 15

2,删除列

2.1,del

del df['A'] # 删除A列,会就地修改

2.2,drop

通过列名称删除:

df = df.drop(['B', 'C'], axis=1)        # drop不会就地修改,创建副本返回

df.drop(['B', 'C'], axis=1, inplace=True)   # inplace=True会就地修改

使用列数删除,传入参数是int,列表,者切片: 

df.drop(df.columns[0], axis=1, inplace=True)    # 删除第1列

df.drop(df.columns[0:3], axis=1, inplace=True)   # 删除前3列

df.drop(df.columns[[0, 2]], axis=1, inplace=True) # 删除第1第3列

2.3,通过各种筛选方法实现删除列

详见pandas“选择行单元格,选择行列“的笔记

3,增加行

3.1,loc,at,set_value

想增加一行,行名称为‘5',内容为[16, 17, 18, 19]

df.loc['5'] = [16, 17, 18, 19]  # 后面的序列是Iterable就行

df.at['5'] = [16, 17, 18, 19]

df.set_value('5', df.columns, [16, 17, 18, 19], takeable=False)  # warning,set_value会被取消

3.2,append

添加有name的Series:

s = pd.Series([16, 17, 18, 19], index=df.columns, name='5')

df = df.append(s)

添加没有name的Series,必须ignore_index:

s = pd.Series([16, 17, 18, 19], index=df.columns)

df = df.append(s, ignore_index=True) 

可以 append字典列表,同样需要必须ignore_index:

ls = [{'A': 16, 'B': 17, 'C': 18, 'D': 19}, {'A': 20, 'B': 21, 'C': 22, 'D': 23}]

df = df.append(ls, ignore_index=True)

3.3,逐行增加

简单的逐行添加内容,可以:

df.loc[len(df)] = [16, 17, 18, 19]

但需要注意:len(df)生成的是int,如果生成的int,df已经存在了,会覆盖该行数据,而不会新增

3.4,插入行

增加行没找到类似insert这种可以插入的方法,暂时替代方法可以先reindex,再赋值: 

df = df.reindex(index=df.index.insert(2, '5'))

df.loc['5'] = [16, 17, 18, 19]

4,df增加列

一般涉及到增加列项时,经常会对现有的数据进行遍历运算,获得新增列项的值,所以这里结合对DataFrame的遍历讨论增加列。

例如,想增加一列'E',值等于'A'和'C'列对应值之和。

4.1,遍历DataFrame获取序列的方法

s = [a + c for a, c in zip(df['A'], df['C'])]     # 通过遍历获取序列

s = [row['A'] + row['C'] for i, row in df.iterrows()] # 通过iterrows()获取序列,s为list

s = df.apply(lambda row: row['A'] + row['C'], axis=1) # 通过apply获取序列,s为Series

s = df['A'] + df['C']                 # 通过Series矢量相加获取序列

s = df['A'].values + df['C'].values          # 通过Numpy矢量相加获取序列

4.2,[ ],loc

通过df[]或者df.loc添加序列

df.loc[:, 'E'] = s

df['E'] = s

4.3,Insert

可以指定插入位置,和插入列名称

df.insert(0, 'E', s)

4.4,concat

s = pd.Series([16, 17, 18, 19], name='E', index=df.index)
df = pd.concat([df, s], axis=1)

4.5,iloc和loc遍历过程中给列赋值

效率比较低

df['E']是DataFrame的一个Series,是引用,对其修改也能改变DataFrame,但运行时报了Warning

df['E'] = None # 需事先创建e列,否则iloc遍历会报错,loc遍历无需事先创建

for i in range(len(df)):

  df['E'].iloc[i] = df['A'].iloc[i] + df['C'].iloc[i] 

# SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame

不用Series不会报Warning:

df['E'] = None

col_no = [i for i in df.columns].index('E') 

for i in range(len(df)):

  df.iloc[i, col_no] = df['A'].iloc[i] + df['C'].iloc[i]

用loc无需先给E列赋空值:

for i in df.index:

  df.loc[i, 'E'] = df.loc[i, 'A'] + df.loc[i, 'C']

4.6,逐列增加

简单的逐列添加内容,可以:

df[len(df)] = [16, 17, 18, 19]

但需要注意:len(df)生成的是int,如果生成的int,df已经存在了,会覆盖该列数据,而不会新增

4.7,其他方法

增加3列,EFG,value默认为np.NaN

df = pd.concat([df, pd.DataFrame(columns=list('EFG'))])  # 列的次序无法指定,并且fillna时会对整个df做出调整

df = df.reindex(columns=list('ABCDEFG'), fill_value=0)  # 列的次序按照list指定,并且fill_value只对新增列做出调整,推荐!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
Jul 14 Python
python的exec、eval使用分析
Dec 11 Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
wxPython色环电阻计算器
Nov 18 Python
python base64库给用户名或密码加密的流程
Jan 02 Python
python实现五子棋程序
Apr 24 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
在echarts中图例legend和坐标系grid实现左右布局实例
May 16 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
Python OrderedDict字典排序方法详解
May 21 Python
Python必须了解的35个关键词
Jul 16 Python
Python项目打包成二进制的方法
Dec 30 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 #Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 #Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 #Python
python实现爬取百度图片的方法示例
Jul 06 #Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
Jul 06 #Python
python3 打印输出字典中特定的某个key的方法示例
Jul 06 #Python
python使用 zip 同时迭代多个序列示例
Jul 06 #Python
You might like
索尼ICF-SW100收音机评测
2021/03/02 无线电
php header()函数使用说明
2008/07/10 PHP
php while循环得到循环次数
2013/10/26 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
javascript 硬盘序列号+其它硬件信息
2008/12/23 Javascript
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
JS 作用域与作用域链详解
2015/04/07 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
Angular2从搭建环境到开发步骤详解
2016/10/17 Javascript
基于JavaScript实现右键菜单和拖拽功能
2016/11/28 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
javascript如何用递归写一个简单的树形结构示例
2017/09/06 Javascript
利用VS Code开发你的第一个AngularJS 2应用程序
2017/12/15 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
python求质数的3种方法
2018/09/28 Python
python实现美团订单推送到测试环境,提供便利操作示例
2019/08/09 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
python如何查看安装了的模块
2020/06/23 Python
Python如何定义接口和抽象类
2020/07/28 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
印度网上药店:1mg
2017/10/13 全球购物
2014年感恩母亲演讲稿
2014/05/27 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
个人总结怎么写
2015/02/26 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
vue中 this.$set的使用详解
2021/11/17 Vue.js
Ruby GDBM操作简介及数据存储原理
2022/04/19 Ruby