本文共 4218 字,大约阅读时间需要 14 分钟。
一个数据框包含索引和数据,可以对索引和数据进行操作。原始数据框:
# 数据index = [['a','a','b','b'],[1,2,3,4],[4,3,2,1]]dict = { '姓名':['任*','江*','陈*','罗*'], '数学':[67,81,81,62], '语文':[71,91,67,61]}df = pd.DataFrame(data=dict,index=index)df
索引常见的属性:索引值、索引名称、索引类型等。
df.rename(mapper=None, index=None, columns=None, axis=None, copy=True, inplace=False, level=None)
参数说明: |
df.rename(index = mapper) 等价于 df.rename(mapper)df.rename(columns=mapper) 等价于 df.rename(mapper,axis=1)
# 传入字典df.rename({2:222})# 传入函数df.rename(lambda x: str(x) + '_t')# 指定轴向,方式一df.rename(lambda x: x + '_t',axis=1)# 指定轴向,方式二df.rename(columns=lambda x: x + '_t')# 指定索引层级df.rename(index={1:'tt'},level=2)备注:也可以用df.set_axis()将所需的索引更新给给定的轴。参考网站:
可以全表替换df.replace() ,或只替换某列df[col]replace()。
df.replace(to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
参数说明: |
# 某1列df['数学'].replace(67,100)# 某几列df[['数学','语文']].replace(67,100)# 某1行df.iloc[0].replace(67,100)# 某几行df.iloc[0:3].replace(67,100)# 整个数据框,所有61换成100df.replace(61,100)
# 多对一映射,67和61都换成100df.replace([67,61], 100)# 一对一映射,67->100,61->99,对应替换df.replace([67,61],[100,99])
# 向前填充,# 设置method时,只需要传入被替换的值# df.replace(np.nan,method='bfill') # method参数一般用于填充空值df.replace(81,method='pad')# 向后填充df.replace(81,method='bfill')
# 传入字典一一对应df.replace({67: 100,61: 99})# 修改指定列的指定值,df.replace({'姓名': '任*','数学': 81}, 100)# 嵌套字典,指定列的值一一对应修改df.replace({'姓名':{'任*':99, '江*': 100}})
# 限制填充个数,结合method参数使用df.replace(81,limit=1)# 使用正则表达式,regex=True#用r''表示''内部的字符串默认不转义df.replace(r'[\u4E00-\u9FA5]\W','正则',regex=True)
对于空值,pandas有专门删除函数df.dropna()和填充函数df.fillna(0)。
跳转连接:缺失值处理# 增加一列,全是100df['英语'] = 100# 根据已存列,计算新列df['总分'] = df['数学'] + df['语文'] + df['英语']# 推荐使用.loc的方式来赋值一列,直接用df[xxx]=的方式在某些情况会出现警告(链式)df.loc[:, '测试'] = 'test'# 根据其他列条件新增列df.loc[df['数学']>= 80 ,'数学优秀'] = '优良'
df.assign(**kwargs)
返回值:一个新的DataFrame对象。注意新增的列名不加引号。
# 新增一列,返回是新的DataFrame对象,改变原DF,需要赋值生效df.assign(性别='男')# df = df.assign(性别='男')# 计算增加列df.assign(t1=df['语文']-df['数学'])# lambda表达式df.assign(t2=lambda x: x['数学']*1.2+15)# 逻辑判断,返回bool值:True or Falsedf.assign(t3=df['数学']>df['语文'])# 类型转换,返回1 或 0df.assign(t4=(df['数学']>df['语文']).astype(int))# map映射,返回指定值df.assign(t5=(df['数学']>df['语文']).map({True:'大于',False:'小于'}))# 同时增加多列,且列之间有关联df.assign(col1=lambda x: x['数学']*5, col2 = lambda x: x['语文']*5, col3 = lambda x: x['col1'] - x['col2']) # col1和col2没有直接生效,不能直接用df['col1']
df.eval(expr, inplace=False, **kwargs)
参数说明: |
返回:ndarray、标量、pandas对象。根据表达式计算列关系,可以指定列名生成新列。
# 直接使用列名,返回seriesdf.eval('语文 + 数学')# 生成新列,返回DataFramedf.eval('e1 = 语文 + 数学')# df.eval('e1 = 语文 + 数学',inplace=True) 立即生效# 生成两列,有依赖关系,必须用三引号df.eval("""c2 = 语文 + 数学 c2_1 = c2 + 英语""" )temp = df['语文'].mean()# 使用外部变量df.eval('e2 = 数学 - @temp')# 逻辑判断,True or Falsedf.eval('e3 = 10 < (数学 - @temp)')
可以根据列索引位置插入新列。参考网站:
删除某一列(不能是多列),只有一个参数,就是列名,传入str参数。返回:被删除的列,原df直接处理。
df.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
通过指定标签名称和相应的轴,或直接指定索引或列名称,删除行或列。使用多索引时,可以通过指定级别来删除不同级别上的标签。
参数说明: |
# 删除列df.drop(['数学','语文'],axis=1)# df.drop(columns=['数学','语文']) 等价# 删除a层级的所有行df.drop(['a'])# 删除第2层级的,索引为1的行df.drop(index=1,level=1)# 删除行列:删除b层级所有行和‘测试这一列’df.drop(index='b',columns=['测试'])
转载地址:http://zxziz.baihongyu.com/