pandas基本数据处理

补充讲解链接
pandas常用函数,个人常用的

1.重命名列名

#用rename函数对数据进行重命名
import pandas as pd
df=pd.DataFrame(data=[
    ['x1','张三',177,92,1.5,'2019/3/23'],
    ['x2','李四',151,84,2.3,'2019/3/24']],columns=['学号','姓名','身高','语文成绩','学分','日期'])
df=df.rename(columns={
    
    '语文成绩':'成绩'})
print(df)

2.增加列,删除列


import pandas as pd
df=pd.DataFrame(data=[
    ['x1','张三',177,92,1.5,'2019/3/23'],
    ['x2','李四',151,84,2.3,'2019/3/24']],columns=['学号','姓名','身高','语文成绩','学分','日期'])
#增加列
df['新列名']=[1,2]
df['新列名1']=df['语文成绩']*0.2

#删除列
df=df.drop(columns=['语文成绩'])#方法1
del df['新列名'] #方法2

print(df)

3.子集选择


import pandas as pd
df=pd.DataFrame(data=[
    ['x1','张三',177,92,1.5,'2019/3/23'],
    ['x2','李四',151,84,2.3,'2019/3/24'],
    ['x3','王五',167,80,3.2,'2019/3/25'],
    ['x4','韩六',175,77,1.2,'2019/3/26'],
    ['x5','赵七',153,87,1.6,'2019/3/27']
],columns=['学号','姓名','身高','语文成绩','学分','日期'])

#子集选择时,采用loc或ioc函数,loc读取 的是索引 ,而iloc读取的行数,相当于重新命名索引为 0,1,2...
print('读取索引范围[2,4]的数据\n',df.loc[2:4])
print('选择第2到第4行\n',df.iloc[1:4])
print('选择身高>160且成绩>80的数据,只要 姓名 学分 日期 \n',df.loc[(df['身高']>160) &(df['语文成绩']>80),['姓名','学分','日期']])
print('选择身高>160且成绩>80的数据, \n',df.loc[(df['身高']>160) &(df['语文成绩']>80)])

4.排序

import pandas as pd
df=pd.DataFrame(data=[
    ['x1','张三',177,92,1.5,'2019/3/23'],
    ['x2','李四',151,84,2.3,'2019/3/24'],
    ['x3','王五',167,80,3.2,'2019/3/25'],
    ['x4','韩六',175,77,1.2,'2019/3/26'],
    ['x5','赵七',153,87,1.6,'2019/3/27']
],columns=['学号','姓名','身高','语文成绩','学分','日期'])


#排序 ,根据语文成绩排序,ascending=True 表示升序,False 表示降序
print(df.sort_values(by=['语文成绩'],ascending=True))

5.缺失值处理,缺失值处理一般使用fillna


import pandas as pd
import numpy as np
df=pd.DataFrame(data=[
    ['x1','张三',177,92,1.5,'2019/3/23'],
    ['x2','李四',151,84,2.3,'2019/3/24'],
    ['x3','王五',167,80,3.2,'2019/3/25'],
    ['x4','韩六',175,77,1.2,'2019/3/26'],
    ['x5','赵七',153,87,1.6,'2019/3/27']
],columns=['学号','姓名','身高','语文成绩','学分','日期'])


#缺失值处理
#先将张三的成绩设为nan
df.loc[(df['姓名']=='张三'),'语文成绩']=np.NaN
df['语文成绩']=df['语文成绩'].fillna(80)
print(df)

6.异常值处理


import pandas as pd
import numpy as np
df=pd.DataFrame(data=[
    ['x1','张三',177,92,1.5,'2019/3/23'],
    ['x2','李四',151,84,2.3,'2019/3/24'],
    ['x3','王五',167,80,3.2,'2019/3/25'],
    ['x4','韩六',175,77,1.2,'2019/3/26'],
    ['x5','赵七',153,87,1.6,'2019/3/27']
],columns=['学号','姓名','身高','语文成绩','学分','日期'])


#异常值处理
#将大于 "均值+2倍标准差“ 认为是异常值,用"均值+2倍标准差”替代
abnormal=df['语文成绩'].mean()+2*df['语文成绩'].std()
df.loc[df['语文成绩']>abnormal,'语文成绩']=abnormal
print(df)

7.分组统计
pandas的分组统计使用groupby函数参数as_index=False 表示统计后返回DataFrame类型的结果,否则返回Series类型的统计结果

import pandas as pd
import numpy as np
df=pd.DataFrame(data=[
    ['x1','张三',177,92,1.5,'2019/3/23','男','1'],
    ['x2','李四',151,84,2.3,'2019/3/24','男','2'],
    ['x3','王五',167,80,3.2,'2019/3/25','女','2'],
    ['x4','韩六',175,77,1.2,'2019/3/26','女','1'],
    ['x5','赵七',153,87,1.6,'2019/3/27','女','1']
],columns=['学号','姓名','身高','语文成绩','学分','日期','性别','班级'])


print('按照班级和性别分组,统计每个分组的人数\n',df.groupby(by=['班级','性别'],as_index=False)['学号'].count())

print('按照班级和性别分组,统计每个分组的平均分\n',df.groupby(by=['班级','性别'],as_index=False)['语文成绩'].mean())


rank=df.groupby(by=['班级'],as_index=False)['语文成绩'].rank()
df['排名']=rank
print('按照班级分组,对组内学生按成绩排序\n', df)



#对每个分组使用自定义函数
#agg 或者apply函数
def myfunc(series):
    return '最大值是:'+str(series.max())
print('对每个分组使用自定义函数\n',df.groupby(by=['班级','性别'],as_index=False)['语文成绩'].agg(myfunc))

8.apply
对于apply函数,其作用是对目标集合中的每个元素执行相同的操作


import pandas as pd
import numpy as np
df=pd.DataFrame(data=[
    ['x1','张三',177,92,1.5,'2019/3/23','男','1'],
    ['x2','李四',151,84,2.3,'2019/3/24','男','2'],
    ['x3','王五',167,80,3.2,'2019/3/25','女','2'],
    ['x4','韩六',175,77,1.2,'2019/3/26','女','1'],
    ['x5','赵七',153,87,1.6,'2019/3/27','女','1']
],columns=['学号','姓名','身高','语文成绩','学分','日期','性别','班级'])


#对姓名这一列的每个元素加字幕xm
def myfunc(x):
    return 'xm'+x
df['姓名']=df['姓名'].apply(myfunc)
print('对姓名这一列的每个元素加字幕xm\n',df)

#对姓名这一列的每个元素删除字幕xm
df['姓名']=df['姓名'].apply(lambda x:str(x).replace('xm', ''))
print('对姓名这一列的每个元素删除字幕xm\n',df)


#对于语文成绩这一列,如果有小于90分的,则该为90分
def myfunc1(x):
    if x<90:
        return 90
    else:
        return x
df['语文成绩']=df['语文成绩'].apply(myfunc1)
print('对于语文成绩这一列,如果有小于90分的,则该为90分\n',df)

#分组应用apply

def myfunc2(series):
    return series.max()
df2=df.groupby(by=['班级'],as_index=False)['语文成绩'].apply(myfunc2)
print(df2)

在这里插入图片描述

作者:电气 余登武

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/115005274