pandas高级操作
1.替换操作
- 替换操作可以同步作用于Series和DataFrame中
- 单值替换- 普通替换;替换所有符合要求的元素- 按照指定单值替换:to_replace={列标签:替换值} value=‘新值’
- 多值替换- 列表替换:to_replace=[],value=[]- 字典替换:(推荐)
to_replace={ro_replace:value,to_replace:value}``````df=DataFrame(data=np.random.randint(0,100,size=(5,6)))#根据值替换#to_replace:原值#value:新值df.replace(to_replace=2,value='Two')#用字典的方式将3替换为threedf.replace(to_replace={3:'three'})#根据位置替换#将指定列的元素进行替换to_replace={列索引:被替换的值}#将第四列中62的值换成fivedf.replace(to_replace={4:62},value='five')
2.映射操作
注意:map是Series的方法,只能被Series调用
- 概念:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定(给一个元素值提供不同的表达方式)
#创建一个df,两列分别是姓名和薪资,然后给其名字起对应的英文名
dic={'name':['张三','李四','张三'],'salary':[15000,20000,15000]}
df=DataFrame(data=dic)
df
#映射关系表
dic1={'张三':'tom','李四':'jack'}
df['e_name']=df['name'].map(dic)
- 当运算工具
# 超过3000部分的钱缴纳50%的税,计算每个人的税后薪资dic={'name':['张三','李四','张三'],'salary':[15000,20000,15000]}defafter_sal(s):if s>3000: s=s-(s-3000)*0.5return s#获取映射结果将结果添加到df中#map(自定义函数)#将salary这个Series中每一个元素作为参数传递给s,salary有几个元素,就调用几次df['after_sal']=df['salary'].map(after_sal)
补充:
- map - 是Series的运算工具
- apply: - 参数是一列或一行的数据,- 作用行或列的元素是DataFrame的运算工具
- applymap,作用到每个元素
3.排序实现的随机抽样
- take()
np.random.permutation()``````df=DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B','C'])#随机生成乱序的随机序列np.random.permutation(10)#将原始数据打乱#行列都打乱,,take只支持隐式索引打乱df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)
4.数据的分类处理
groupby()
函数groups
属性查看分组情况df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],'price':[4,3,3,2.5,4,2],'color':['red','yellow','yellow','green','green','green'],'weight':[12,20,50,30,20,44]})#根据item分组,水果种类进行分析df.groupby(by='item')#<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000022A81B5E820>#查看分组详情df.groupby(by='item').groups
- 分组聚合
#分组聚合#根据种类分组,取价格求均值df.groupby(by='item')['price'].mean()#根据颜色分组,求重量的均值,转为字典dic=df.groupby(by='color')['weight'].mean().to_dict()#将重量的均值在df中新增一列添加进去df['mean_w']=df['color'].map(dic)
5.高级数据聚合
- 使用
groupby
分组后,也可以使用transform和apply提供自定义函数实现更多的运算 df.groupby('item')['price'].sum()<==>df.groupby('item')['price'].apply(sum)
transform
和apply
都会进行运算,在transform
或者apply
中传入函数即可transform
和apply
也可以传入一个lambda
表达式agg()
,分组后进行多种不同的聚合操作df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],'price':[4,3,3,2.5,4,2],'color':['red','yellow','yellow','green','green','green'],'weight':[12,20,50,30,20,44]})#求均值defmy_mean(s): m_sum=0for i in s: m_sum+=i return m_sum/len(s)#自定义函数df.groupby(by='item')['price'].transform(my_mean)#返回经过映射的结果,直接可以映射df.groupby(by='item')['price'].transform(my_mean)#返回的不是进过映射的结果df.groupby(by='item')['price'].apply(my_mean)
6.透视表
- 概念- 透视表是一种可以对数据动态排布并且分类汇总的表格格式,pivot_table
- 优点- 灵活性高,可以随意定制分析计算要求- 脉络清晰易于理解数据- 操作性强,报表神器
- 重要参数- index:分类汇总的条件 - 每一个pivot_table必须拥有一个index- values:需要对计算的数据进行筛选- columns:设置列层次字段 - 对values字段再进行分类- aggfunc:设置对数据聚合时进行的函数操作 - 当我们未设置aggfunc时,他默认aggfunc='mean’计算均值
df=pd.read_csv('./data/透视表-篮球赛.csv',encoding='utf8')#index:分类#values:筛选数据筛选#aggfunc:运算方式#分类条件,在index中,列索引,筛选列值索引,筛选之后进行求和df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'],aggfunc='sum')#columns:进行二次分类#fill_value:无数据填0# 根据主客场再分对手进行求和df.pivot_table(index='主客场',values='得分',columns='对手',aggfunc='sum',fill_value=0)
7.交叉表
- 是一种用于计算分组的特殊透视图,对数据进行汇总
pd.crosstab(index,columns)
- index:分组数据,交叉表的行索引- columns:交叉表的列索引
df = DataFrame({'sex':['man','man','women','women','man','women','man','women','women'],'age':[15,23,25,17,35,57,24,31,22],'smoke':[True,False,False,True,True,False,False,True,False],'height':[168,179,181,166,173,178,188,190,160]})#求出各个性别抽烟的人数#根据smoke,sex,进行汇总,smoke为列,sex为行,默认计数
pd.crosstab(df.smoke,df.sex)
本文转载自: https://blog.csdn.net/m0_46926492/article/details/124316199
版权归原作者 荼靡, 所有, 如有侵权,请联系我们删除。
版权归原作者 荼靡, 所有, 如有侵权,请联系我们删除。