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实现自动登录人人网并访问最近来访者实例
Sep 26 Python
跟老齐学Python之大话题小函数(1)
Oct 10 Python
分享python数据统计的一些小技巧
Jul 21 Python
Python 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
Jun 09 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
解决pyqt5异常退出无提示信息的问题
Apr 08 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 Python
Django框架中表单的用法
Jun 10 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 变量未定义等错误的解决方法
2011/01/12 PHP
php 冒泡排序 交换排序法
2011/05/10 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
两种php给图片加水印的实现代码
2020/04/18 PHP
PHP的Yii框架入门使用教程
2016/02/15 PHP
心扬JS分页函数代码
2010/09/10 Javascript
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
IE与FF下javascript获取网页及窗口大小的区别详解
2014/01/14 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
javascript之Array 数组对象详解
2016/06/07 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
AngularJS使用ng-inlude指令加载页面失败的原因与解决方法
2017/01/19 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
详解Vue webapp项目通过HBulider打包原生APP(vue+webpack+HBulider)
2019/02/02 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
2019/11/09 Javascript
vue操作dom元素的3种方法示例
2020/09/20 Javascript
Python基础之函数用法实例详解
2014/09/10 Python
Python创建文件和追加文件内容实例
2014/10/21 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
深入浅析Python中list的复制及深拷贝与浅拷贝
2018/09/03 Python
Python sorted对list和dict排序
2020/06/09 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
为您的家、后院、车库等在线购物:Spreetail
2019/06/17 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
如何删除一个表里面的重复行
2013/07/13 面试题
商业活动邀请函
2014/02/04 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
业务员辞职信范文
2015/03/02 职场文书
人事任命通知
2015/04/20 职场文书
企业党建工作总结2015
2015/05/26 职场文书
Redis命令处理过程源码解析
2022/02/12 Redis