上面介绍完毕了DataFrame的行搜索操作,现在来介绍行添加操作.
注意这与列添加操作是不一样的.添加列使用的是insert,添加行使用的是append
使用append函数,可以将新的数据行添加到DataFrame中,该函数会在行末追加数据行
df. append (other,ignore_index=False,verify_integrity=False,sort=False)
将"other"追加到调用者的末尾,返回一个新对象。"other"行中不在调用者中的列将作为新列添加。也就是如果你的other中的数据插如了此前没有的(其实只要你插的长度比之前行的长度都长,那么就会触发这个效果),那么就会添加一个新列来表示这一数据
- other : DataFrame或Series/dict类对象,或这些对象的列表
- ignore_index:默认为False,如果为True将不适用index标签.即如果为False,进行添加时必须提供该数据对应的索引,否则报错
- verify_integrity:默认为False,如果为True,则在创建具有重复项的索引时引发ValueError
- sort:排序
首先是以字典的形式进行添加,如果直接创建一个字典然后使用append,那么如果ignore_index为False,那么必须指定索引,否则报错.
但是如果使用Series进行添加,并且设定了name这个属性,那么name属性的值就会变为其标签名称
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) print(df) print('-------') new={'Name':'sun','Age':88} df1 = df.append(new,ignore_index=True)# 使用ignore将使index自增 print(df1) print('-------') s = pd.Series(new,name='a') # 如果直接使用Series,并且指定name,那么就会把name的值作为行的index进行插入 df2 = df1.append(s) print(df2)
同时也可以使用列表进行追加,但是有一些特殊的地方
如果list是一维的,则以列的形式追加
如果list是二维的,则以行的形式追加
如果list是三维的,只添加一个值
同时需要注意,使用append可能会出现相同的index,想避免的话,可以使用ignore_index=True
先介绍一位的,由于是直接向某列添加数据,并且会创建新的行,因此这就会导致其他列上的数据为NaN,因此使用较少
data=[ [1,2,3,4], [5,6,7,8] ] df = pd.DataFrame(data) print(df) print('--------------') l1 = [1,2] df1 = df.append(l1) print(df1) print('--------------') df2 = df.append(l1,ignore_index=True) print(df2)
再看下面一组代码,直接使用的是二位列表进行添加,并且没有指定index和columns的名称,然后你注意看结果
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) print(df) print('-------') # 添加二位列表,那么以行添加 # 同时由于没有指定index和column的名称 # 因此会直接添加新的列和行 l1 = [['zhao',52,'m'],['qian',33,'f']] df1 = df.append(l1) print(df1) print('-------') df2 = df1.append(l1,ignore_index=True) print(df2)
可以发现不仅多出来了3列,而且行索引也并没有接下去,
而如果要使得行索引接下去,那么就要使得ignore_index=True
但是列这个新多出来的标签咋么办呢?
其实可以想到之所以会多出这三列,也就是因为没有指定columns这个属性,那么这个属性可以在DataFrame创建的时候进行指定,因此我们可以先把list集合中的数据用于创建DataFrame,同时在DataFrame中设定对应的columns标签,如下
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) print(df) l1 = [['zhao',52,'m'],['qian',33,'f']] print('-------') df3 = pd.DataFrame(l1,columns=['Name','Age','Sex']) df4 = df.append(df3,ignore_index=True) print(df4)
最后是三维的数据,不多介绍,看代码就能理解个大概
data=[ [1,2,3,4], [5,6,7,8] ] df = pd.DataFrame(data) print(df) print('--------------') l1 = [ [[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]], [[1,2,3,4],[1,2,3,4],[1,2,3,4]] ] # 三维的话,会把最里面的数据直接作为新一行上每一列上的新数据 df1 = df.append(l1,ignore_index=True) print(df1)
添加操作介绍完毕,现在开始介绍删除操作
删除操作与列操作的pop类型,行的删除操作使用的是drop
drop将会返回删除数据后的DataFrame数据,而不是再操作的数据上进行修改,当然,我们也可以把drop函数的inplace设置为True,如果这样就是再原有的数据上进行修改了
通过传递一个行索引标签,从DataFrame中删除某一行数据。如果所有标签存在重复,那么他们将被一起删除,如下:
df = pd.DataFrame([[1,2],[3,4]],columns=['a','b']) df2 = pd.DataFrame([[5,6],[7,8]],columns=['a','b']) df = df.append(df2) # 注意这里没有使用ignore_index,因此新增的两行的行标签为0 1 print(df) df3 = df.drop(0) # 删除行标签为0的行 print(df3) # 发现删了两行
转置
返回DataFrame的专职,也就是把行和列进行交换
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) print(df) print('-------') df.T # 转置操作
axes
返回一个行标签 ,列表前组成的列表
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) print(df.axes) # 一次性直接显示行和列标签 print(df.index,df.columns) # 分别显示行和列标签
dtypes
dtypes用于返回每一列的数据类型
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) df.dtypes
empty
返回一个布尔值,判断输出数据对象是否为空,若为空则为True
def is_empty(df): if df.empty: return True else: return False; data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) print(df.empty) print(is_empty(df)) df = pd.DataFrame() print(df.empty) print(is_empty(df))
columns
返回DataFrame所有列标签
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) print(df.columns) # 返回列表前 print(df.columns.size) # 返回列标签个数
shape
返回一个元组,获取行数和列数,表示了DataFrame维度
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) rows,cols = df.shape print(df.shape) print(rows,cols)
values
以ndarray数组的形式返回DataFrame中的数据
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data)
rename
DataFrame.rename(index=None,columns=None,inplace=False)
- index:修改后的行标签
- columns:修改后的列标签
- inplace:默认为False,不改变源数据,返回修改后的数据. True更改源数据
该方法用于修改列名,并且可以修改部分行或者列
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) print(df) print('------') df.rename(index={0:'zero',1:'one',2:'two',3:'three'},inplace=True) print(df) print('------') df.rename(columns={'Name':1,'Age':2,'Sex':3},inplace=True) print(df) print('------') df = pd.DataFrame(data) print(df) print('------') df.rename(index={0:'zero',1:'one',2:'two',3:'three'},columns={'Name':1,'Age':2,'Sex':3},inplace=True) print(df)
info
用于打印DataFrame的简要摘要,显示有关DataFrame的学习,包括索引的数据类型dtype和列的数据类型dtype,非空值的数量和内存的使用情况
data={ 'Name':['wang','zhang','li','liu'], 'Age':[12,32,42,18], 'Sex':['m','f','f','m'] } df = pd.DataFrame(data) print(df.info())
sort_index
sort_index (axis=0,ascending=True,inplace=False)
作用:默认根据行标签对所有行排序,或根据列标签对所有列排序,或根据指定某列或某几列对行排序。
注意: df.sort_index()可以完成和df.sort_values()完全相同的功能,但python更推荐用只用df.sort_index()对“根据行标签"和“根据列标签"排序,其他排序方式用df.sort_values()
- axis: 0按照行名排序;1按照列名排序
- ascending:默认True升序排列;False降序排列
- inplace:默认False,否则排序之后的数据直接替换原来的数据
df = pd.DataFrame({ 'b':[3,2,1], 'c':[4,7,2], 'a':[8,5,3], 'd':[2,1,3]}, index=[2,1,0] ) print(df) print('-------') df.sort_index(inplace=True) print(df) print('-------') df.sort_index(axis=1,inplace=True,ascending=False) print(df)
sort_values
DataFrame.sort_values(by,axis=0, ascending=True,inplace=False,kind='quicksort',na_position=' last')
作用:既可以根据列数据,也可根据行数据排序。
注意:必须指定by参数,即必须指定哪几行或哪几列;无法根据index名和columns名排序(由.sort_index()执行)
- by: str or list of str;如果axis=0,那么by=“列名”;如果axis=1,那么by=“行名”。
- axis: {0 or ‘index’, 1 or ‘columns’}, default 0,默认按照列排序,即纵向排序;如果为1,则是横向排序。
- ascending:布尔型,True则升序,如果by=[列名1.列名2’],则该参数可以是[True, False],即第一字段升序,第二个降序。
- inplace:布尔型,是否用排序后的数据框替换现有的数据框。
- na_position: {‘first’, last’}, default ‘last’,默认缺失值排在最后面。
df = pd.DataFrame({ 'b':[3,2,2,4], 'c':[4,7,2,6], 'a':[8,5,3,2], 'd':[2,1,3,7]}, index=[2,1,0,3] ) print(df) print('--------') df.sort_values('b',inplace=True) print(df) print('--------') df.sort_values(['b','a'],inplace=True,ascending=[True,True]) # 以b的升序进行排序,如果b列数据相同,那么再按照a的升序进行排序 print(df) print('--------') # 按行3升序,行0降序排列 只有行3的数据重复了,才会依靠行0进行排序 df.sort_values([3,0],axis=1,inplace=True,ascending=[True,False]) print(df)