title: D08|Pandas DataFrame插入、关联、修改、删除
author: Adolph Lee
categories: 数据挖掘基础
tags:
- Python
- 数据挖掘基础
- Pandas
- DataFrame
![6ef2b237ebd6f0c573879a8d59233b34.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/93a96e13de5deddfabbe1c6d99971c07.png)
dropna 、 drop_duplicate
- dropna 删除空值
- drop_duplicate 删除重复值