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中利用函数装饰器实现备忘功能
Mar 30 Python
Python易忽视知识点小结
May 25 Python
Python实现拷贝多个文件到同一目录的方法
Sep 19 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
Django项目实战之用户头像上传与访问的示例
Apr 21 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
在linux系统下安装python librtmp包的实现方法
Jul 22 Python
python 矢量数据转栅格数据代码实例
Sep 30 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
在keras中对单一输入图像进行预测并返回预测结果操作
Jul 09 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
提升PHP执行速度全攻略(上)
2006/10/09 PHP
聊天室php&mysql(二)
2006/10/09 PHP
PHP 查找字符串常用函数介绍
2012/06/07 PHP
解析如何屏蔽php中的phpinfo()函数
2013/06/06 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
2013/10/25 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
thinkPHP5.0框架独立配置与动态配置方法
2017/03/17 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
Windows 系统下安装和部署Egret的开发环境
2014/07/31 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
webpack搭建vue 项目的步骤
2017/12/27 Javascript
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
vue实现扫码功能
2020/01/17 Javascript
JavaScript实现单点登录的示例
2020/09/23 Javascript
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
Jupyter notebook远程访问服务器的方法
2018/05/24 Python
浅谈pandas用groupby后对层级索引levels的处理方法
2018/11/06 Python
Python中psutil的介绍与用法
2019/05/02 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
中学教师自我鉴定
2014/02/07 职场文书
2014年国培研修感言
2014/03/09 职场文书
升职自荐信怎么写
2015/03/05 职场文书
运动会3000米加油稿
2015/07/21 职场文书
遇事可以测出您的见识与格局
2019/09/16 职场文书
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript