插入ora-00957: 重复的列名_D08 Pandas DataFrame 插入、关联、修改、删除 方法合集


title: D08|Pandas DataFrame插入、关联、修改、删除
author: Adolph Lee
categories: 数据挖掘基础
tags:

  • Python
  • 数据挖掘基础
  • Pandas
  • DataFrame

6ef2b237ebd6f0c573879a8d59233b34.png

插入

insert 插入列

insert(self, loc, column, value, allow_duplicates=False)

  •   loc 插入列索引的位置
  •   column 插入列的名称
  •   value 插入值 可以是整数、Series或者相同结构的数组
  •   是否允许列索引名称重复,默认为False 当列索引名称重复时抛出异常
  •   返回值为None,其直接在原df基础上修改

import pandas as pdimport numpy as npmain_df = pd.DataFrame(np.arange(0,30).reshape(6,5),index=['a','c','d','e','f','b'],columns=['A','B','C','D','E'])sub_df = pd.DataFrame(np.arange(100,118).reshape(6,3),columns=['A','B','C'])main_df.insert(3,'F',sub_df.loc[:,['A']].values)print(main_df)

839c9aadffe196de71ae60585772086d.png

append 插入行

append(self, other, ignore_index=False, verify_integrity=False, sort=None)

  •   other 插入值 可以是DataFrame 、Series、或者类似结构的数组、列表
  •   ignore_inde 是否忽略原来的行索引,生成新的RangeIndex行索引,默认为Fasle 不忽略
  •   verify_integrity 验证行索引是否重复,若重复则抛出异常
  •   sort 对新的df排序,使用时请手动设置为False
  •   返回值为新的DataFrame

import pandas as pdimport numpy as npmain_df = pd.DataFrame(np.arange(0,30).reshape(6,5),index=['a','c','d','e','f','b'],columns=['A','B','C','D','E'])sub_df = pd.DataFrame(np.arange(100,118).reshape(6,3),columns=['A','B','C'])main_df = main_df.append(sub_df.loc[[5],:],ignore_index=True,sort=False)print(main_df)

326f45fb78911368845956a39dc7a0fa.png

关联

join

join(self, other, on=None, how=’left’, lsuffix=’’, rsuffix=’’, sort=False)
同通过行索引或指定列,关联另一个列表或Series中的元素,返回一个新列表。类似sql的join。可以将其描述为一个DataFrame列或行索引与另一个DataFrame的行索引关联。

  •   other 关联的数据,可以是DataFram、Series
  •   on 指定要关联的列,默认是通过行索引进行关联
  •   how 关联方式,提供left join 左联,right join 右联,out join 外联, inner join内联,默认为left
  •   lsuffix 为了避免字段名重复,为左关联对象字段添加后缀
  •   lsuffix 为了避免字段名重复,为右关联对象字段添加后缀
  •   sort 排序,默认为False
  •   返回一个新的DataFrame
    下面的案例中主要以左关联为主讲解,更多方式请自行尝试。

import pandas as pdimport numpy as npleft_df = pd.DataFrame(np.arange(0,30).reshape(6,5),columns=['A','B','C','D','E'])right_df = pd.DataFrame(np.arange(0,18).reshape(6,3),columns=['A','F','G'])print(left_df,'',right_df)# 左DataFrame的‘A’列关联右DataFrame 行索引new_df = left_df.join(right_df,on='A',how='left',lsuffix='_left',rsuffix='_right')print(new_df) # 可以看到右DataFrame第0行和第5行被关联成功# 左DataFrame的行索引关联右DataFrame的行索引new_df = left_df.join(right_df,lsuffix='_left',rsuffix='_right')print(new_df)# 左DataFrame的'A'列与右DataFrame的'A'列关联new_df = left_df.join(right_df.set_index('A'),on='A') # 将右DataFrame的’A‘列设置为索引即可print(new_df)new_df = left_df.set_index('A').join(right_df.set_index('A')) # 或将两个DataFrame的行索引都设置为需要关联的列print(new_df)

fbdc4f3d659803145e23e6a296df7d7e.png

merge

merge(self, right, how=’inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(‘_x’, ‘_y’), copy=True, indicator=False, validate=None)
这个方法参数很多,不要被吓到,其实它跟join类似,比join强大的地方在于,它可以指定任意列进行关联,而不需要将其转换为索引的形式,它同时也兼容了join的功能。

  •   right 需要关联的DataFrame
  •   how 关联方式,提供left join 左联,right join 右联,out join 外联, inner join内联,默认为inner
  •   on 关联列索引名称,当左右DataFrame的关联列索引名称相同时,可以直接指定on,而省略left_on 和 right_on
  •   left_on 左DataFrame被关联的列名
  •   right_on 右DataFrame被关联的列名
  •   left_index 使用左DataFrame的行索引进行关联,默认为False
  •   right_index 使用右DataFrame的行索引进行关联,默认为False
  •   sort 排序 默认为False
  •   suffixes 为了避免字段名重复,为两个DataFrame列索引增加后缀,默认为(‘’,’’)
  •   copy 拷贝数据,默认为False
  •   indicator 默认为False,如果为真,则会添加一个解释列。用以解释,关联结果。
  •   validate 检测左右DataFrame的合并键是否属于指定类型。值域{one_to_one,one_to_many,many_to_one,many_to_many}

import pandas as pdimport numpy as npleft_df = pd.DataFrame(np.arange(0,30).reshape(6,5),columns=['F','B','A','D','E'])right_df = pd.DataFrame(np.arange(0,18).reshape(6,3),columns=['A','F','G'])print(left_df,'',right_df)# 左DataFrame的‘B’列关联右DataFrame‘F’列new_df = left_df.merge(right_df,left_on='B',right_on='F',how='left',suffixes=('_left','_right'))print(new_df)# 左DataFrame的‘F’列关联右DataFrame‘F’列 # 当使用左/右关联时,作为关联列的Key在左右侧名称相同时,会只保留左侧/右侧。new_df = left_df.merge(right_df,on='A',how='left',suffixes=('_left','_right'))print(new_df)

16e42e97175dadf8e93b05251b5fe2e3.png

修改

Update

update(self, other, join=’left’, overwrite=True, filter_func=None, errors=’ignore’)
关联并替换原有的值,通过列索引关联,并替换相同列索引对应的值

  •   other 关联替换的值,DataFrame或Series
  •   join 关联方式 仅支持左关联
  •   overwrite 默认为True替换所有能够关联的值,若为False则仅替换NaN值
  •   errors 值为’raise’ or ‘ignore’,决定能够匹配的行,左右都存在NaN值时是否抛出异常

import pandas as pdimport numpy as npleft_df = pd.DataFrame(np.arange(0,30).reshape(6,5),columns=['F','B','A','D','E'])right_df = pd.DataFrame(np.arange(100,118).reshape(6,3),index=[0,2,4,6,8,10],columns=['A','F','G'])print(left_df,'',right_df)left_df.update(right_df)# 建议自己替换一下参数,观察替换结果的变化print(left_df)

3ba3d757fce202eca4c422889b6845f5.png

at,iat,loc,iloc

import pandas as pdimport numpy as npleft_df = pd.DataFrame(np.arange(0,30).reshape(6,5),columns=['F','B','A','D','E'])print(left_df)left_df.at[1,'A'] = 999print(left_df)left_df.iloc[1:6,[3,4]] = 999print(left_df)
ef745f892c3b07a9cfef58208b3900f3.png

删除

pop

  •   删除列,并将被删除的列转化为Series返回

import pandas as pdimport numpy as npleft_df = pd.DataFrame(np.arange(0,30).reshape(6,5),columns=['F','B','A','D','E'])pop_A = left_df.pop('A')print(pop_A)

0c89d076870e5198097c3728b7db4c9e.png

drop

drop(self, labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors=’raise’)
通过指定行列索引来删除行或列

  •   labels 行、列索引的标签名称
  •   axis = 0 删除列 axis = 1 删除行
  •   index 行索引标签
  •   columns 列索引标签
  •   level 使用多级索引时,指定索引层级
  •   inplace 若为True则在原DataFrame上操作,返回空。若为False则返回新DataFrame
  •   errors 当传入的标签不再DataFrame时,是否抛出异常。’raise’ or ‘ignore’
import pandas as pdimport numpy as npleft_df = pd.DataFrame(np.arange(0,30).reshape(6,5),columns=['F','B','A','D','E'])left_df.drop(columns='A',inplace=True)print(left_df)

93a96e13de5deddfabbe1c6d99971c07.png

dropna 、 drop_duplicate

  •   dropna 删除空值
  •   drop_duplicate 删除重复值

转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值