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搭建APNS苹果推送通知推送服务的相关模块使用指南
Jun 02 Python
Python实现爬取需要登录的网站完整示例
Aug 19 Python
pyqt远程批量执行Linux命令程序的方法
Feb 14 Python
详解pyppeteer(python版puppeteer)基本使用
Jun 12 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
Django微信小程序后台开发教程的实现
Jun 03 Python
记一次django内存异常排查及解决方法
Aug 07 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
Python装饰器的练习题
Nov 23 Python
python游戏开发Pygame框架
Apr 22 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
smarty获得当前url的方法分享
2014/02/14 PHP
php中spl_autoload详解
2014/10/17 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
extjs 学习笔记(二) Ext.Element类
2009/10/13 Javascript
Javascript load Page,load css,load js实现代码
2010/03/31 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
DOM 高级编程
2015/05/06 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
详解angular分页插件tm.pagination二次触发问题解决方案
2018/07/20 Javascript
小程序云开发实战小结
2018/10/25 Javascript
JS数据类型判断的几种常用方法
2020/07/07 Javascript
python基础教程之自定义函数介绍
2014/08/29 Python
Python修改MP3文件的方法
2015/06/15 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
json跨域调用python的方法详解
2017/01/11 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
python实现公司年会抽奖程序
2019/01/22 Python
Django的性能优化实现解析
2019/07/30 Python
Python猜数字算法题详解
2020/03/01 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
学习决心书范文
2014/03/11 职场文书
阳光体育活动实施方案
2014/05/25 职场文书
食品安全承诺书范文
2014/08/29 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
小学语文教学随笔
2015/08/14 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
党员反邪教心得体会
2016/01/15 职场文书
javascript对象3个属性特征
2021/11/17 Javascript
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技