行列的增删
添加操作
列尾部添加
- df[new_col] = values 索引引用方法
- pd.DataFrame.assign(**kwargs) ⇒ NewDataFrame assign方法添加多个列
列中间插入
- pd.DataFrame.insert(loc, column: 'Hashable', value: 'Scalar | AnyArrayLike',allow_duplicates: 'bool | lib.NoDefault' = <no_default>)
- loc:int,Insertion index. 插入位置
- column : str, number, or hashable object Label of the inserted column.插入的索引名
- value : Scalar, Series, or array-like
- allow_duplicates : bool, optional, default lib.no_default
行尾部添加
- df.loc[new_index] = values loc索引添加行
- pd.DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=False)
- The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
行中间插入
pandas中没有特定的行中间插入的方法,可以使用concat拼接方法来实现,比如
df2 = pd.concat([df.loc[:0], data, df.loc[1:]]).reset_index(drop=True)
列尾部添加:可以使用loc属性进行列扩展,但是iloc属性是无法扩展带入的。
assign方法讲解:使用assign方法可以对任意数量的参数(可变长)进行指定,assign方法指定的关键字作为列名使用。同时,assign方法并不会对原数组对象发生变动,而是生成修改。
行尾部添加:也可以通过loc属性索引的方式尾部添加行或者用append方法添加新行。
中间插入列:使用insert方法中间冲入列,第一个参数为新列的位置索引,第二个参数为新列的标签名,第三个参数为新列的数值。如果loc参数为len(df.columns),将会在最后一列追加新列。
删除操作
- del DateFrame[col] 删除column列(了解即可)
- pd.DataFrame.drop(labels = None, axis = 0, index = None, columns = None, level = None, inplace = False, errors = 'raise')
- labels : single label or list-like; Index or column labels to drop. A tuple will be used as a single label and not treated as a list-like.
- axis : {0 or 'index', 1 or 'columns'}, default 0; Whether to drop labels from the index (0 or 'index') or columns (1 or 'columns').
- index : single label or list-like; Alternative to specifying axis (``labels, axis=0`` is equivalent to ``index=labels``).
- columns : single label or list-like; Alternative to specifying axis (``labels, axis=1`` is equivalent to ``columns=labels``).
- level : int or level name, optional; For MultiIndex, level from which the labels will be removed.
- inplace : bool, default False; If False, return a copy. Otherwise, do operation inplace and return None.
- errors : {'ignore', 'raise'}, default 'raise';If 'ignore', suppress error and only existing labels are dropped.
- return:返回处理后的DataFrame,原对象不变。
- pd.DataFrame.pop(self, item: 'Hashable') -> 'Series'
- item : label; Label of column to be popped.
- return:返回删除的单列, Series对象,原对象变动。
下面讲解del语句删除单列(不能实现多列删除)和drop方法实现删除。其中相较于del语句,drop方法灵活度,通用性更高,代码逻辑更清晰,del语句仅了解即可。
- 语句del df.loc[]语法是错误的,索引删除列方式只有
del df[col]
语法,单列删除
- drop方法返回处理后新对象,原对象不变
对于DataFrame对象行列的删除方法还有多种,比方, 该方法参数传入单个列标签,可以将该单列返回,并会对该单列
数据拼接
在数据预处理和数据分析中,经常需要对多个数据进行拼接操作。pandas中提供了可以应对复杂操作且使用灵活的函数方法和类方法。在本节,主要讲解concat方法和merge方法。
- concat:多个对象行列拼接
- 可以重新定义索引
- 可以标签索引全集拼接和交集拼接
- merge:多个对象连接(类似SQL语言的多表连接)
- 一对一
- 一对多
- 多对多
pd.concat方法
- pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)->'DataFrame | Series'
- objs:需要连接的 pandas 对象的序列或映射。如果传递的是字典,那么字典的键将用作 参数
- axis:{0/'index', 1/'columns'}, default 0,上下拼接,若为1则左右拼接。
- join:{'inner', 'outer'}, default 'outer'
- outer:返回所有的行
- inner:返回两个都有的行
- ignore_index : bool, default False,表示保留原始索引。为True,则原始索引不保留,默认创建整数索引
- keys : sequence, default None。如果传递,则必须传递与连接对象相同长度的序列。此参数可用于创建多级索引的结果。
- levels : list of sequences, default None。用于构造多层索引的特定级别。
- names : list, default None。用于创建结果分层索引的名称。
- verify_integrity : bool, default False。检查新连接的轴是否包含重复项。如果它确实如此,那么将会引发异常。默认情况下,该检查被禁用,对于大型数据连接可以节省大量时间。
- sort : bool, default False。默认情况下,连接操作不会尝试对结果进行排序。设置为 True(默认值是False)将尝试对结果进行排序,但是这可能会引入性能问题
- copy : bool, default True。如果为False ,则避免复制数据到结果数据结构中。默认情况下总是复制。
pd.concat函数的参数众多,在这里重点讲解axis、ignore_index、join参数。
注:join参数(inner和outer)用于在上下拼接中。
pd.merge方法**
merge函数可以将两个DataFrame对象根据关联的列或者行索引作为连接键进行左右拼接,类似与SQL语句中的联表查询语句。合并操作在数据分析和机器学习中时极为常用的一种操作。
- pd.merge(left 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)
- left : DataFrame;参与合并的左侧DataFrame
- right : DataFrame or named Series;参与合并的右侧DataFrame或Series
- how : {'left', 'right', 'outer', 'inner', 'cross'}, default 'inner'。分别对应左连接,右连接,外连接,内连接,xx
- on : label or list;用于连接的列名,必须同时存在于左右两个DataFrame对象中,如果未指定,则以left和right列名的交集作为连接键
- left_on : label or list, or array-like;左侧DataFarme中用作连接键的列
- right_on : label or list, or array-like;右侧DataFarme中用作连接键的列
- 当连接的两个标签名不一致无法用on进行拼接时使用这个
- left_on,right_on分别对应左右表的用于连接的两个标签
- left_index : bool, default False;如果设为 True,则使用左 DataFrame 对象的索引作为连接键
- right_index : bool, default False;如果设为 True,则使用右 DataFrame 对象的索引作为连接键
- sort : bool, default False;根据连接键对合并后的数据进行排序,默认为True。有时在处理大数据集时,禁用该选项可获得更好的性能
- suffixes : list-like, default is ("_x", "_y");字符串值元组,用于追加到重叠列名的末尾,默认为(‘_x’,‘_y’).
- eg: 左右两个DataFrame对象都有‘data’,则结果中就会出现‘data_x’,‘data_y’
- copy : bool, default True;设置为False,可以在某些特殊情况下避免将数据复制到结果数据结构中。默认总是赋值
- indicator : bool or str, default False;方法实际上会将合并后的数据集增加一列,默认的列名是"_merge"。
- 作用:知道每一行数据的来源,如果来自 left,值就是 left_only,如果来自 right,值就是 right_only,如果是两者都有,值就是 both
- validate : str, optional; If specified, checks if merge is of specified type.(检验拼接类型,如果参数为”one_to_one”,但是实际拼接方式不是一对多,就会报错)
- "one_to_one" or "1:1": check if merge keys are unique in both left and right datasets.
- "one_to_many" or "1:m": check if merge keys are unique in left dataset.
- "many_to_one" or "m:1": check if merge keys are unique in right dataset.
- "many_to_many" or "m:m": allowed, but does not result in checks.
- 一对一(one to one):指在双方的数据中,一方的数据对应另一方的单个数据的情况
- 一对多(one to many):指一方的某一数据可能对应另一方的多个数据的情况。
- 多对多(many to many):指双方数据中分别有多个数据对应另一方的多个数据的情况。
数据关联性:
在对数据进行合并时,双方数据的关联性有3种情况。要正确地对数据进行合并,就需要理解这三种关联性:
演示:
本节重点讲解参数on(有相同的列名做连接键用on)、left_on、right_on(没有相同的列名做连接键,不能用on参数,则指定两个列名做连接键进行连接)、suffixes(拼接后有相同列名的为区分列名后加后缀名)、how(SQL类似的拼接方式)、left_index、right_index(将left、right的索引作为连接键)
准备数据:
案例:参数on、left_on、right_on、suffixes、how
案例:on参数、how参数(left、right、outer、inner)和left_index、right_index
how参数 | 内容 |
left | 只使用第一个参数left的FataFrame对象的键值。键值的顺序不变 |
right | 只使用第二个参数right的FataFrame对象的键值。键值的顺序不变 |
outer | 外部结合,两个DataFrame对象的键值的并集。键值按照字典的顺序进行排列 |
inner | 默认值。内部结合,两个DataFrame对象的键值的交集。键值按照字典的顺序进行排列 |