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手机号码归属地查询代码
May 04 Python
python安装mysql-python简明笔记(ubuntu环境)
Jun 25 Python
Python编程求质数实例代码
Jan 31 Python
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
Python2.7.10以上pip更新及其他包的安装教程
Jun 12 Python
python 生成图形验证码的方法示例
Nov 11 Python
用python实现刷点击率的示例代码
Feb 21 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
python中如何设置代码自动提示
Jul 15 Python
Python3爬虫中识别图形验证码的实例讲解
Jul 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
PHP 文件上传全攻略
2010/04/28 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
vue-ajax小封装实例
2017/09/18 Javascript
Angular2使用vscode断点调试ts文件的方法
2017/12/13 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
layer.js之回调销毁对话框的例子
2019/09/11 Javascript
Python实现的科学计算器功能示例
2017/08/04 Python
go和python变量赋值遇到的一个问题
2017/08/31 Python
使用pandas中的DataFrame数据绘制柱状图的方法
2018/04/10 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python 获取主机ip与hostname的方法
2018/12/17 Python
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
高三自我鉴定
2013/10/23 职场文书
自主招生自荐信
2013/12/08 职场文书
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
2015年超市工作总结
2015/04/09 职场文书
公司开业主持词
2015/07/02 职场文书
详解Python小数据池和代码块缓存机制
2021/04/07 Python
pytorch 使用半精度模型部署的操作
2021/05/24 Python
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python