替换操作
- 替换操作可以同步作用于Series和DataFrame中
- 单值替换
- 普通替换:替换所有符合要求的元素:to_replace=15,value='e'
- 按列指定单值替换:to_replace={列标签:替换值}value=‘value’
- 多值替换
- 列表替换:to_replace=[] value=[]
- 字典替换(推荐)to_replace={to_place:value,to_place:value}
import numpy as np
import pandas as pd
from pandas import DataFrame
df = DataFrame(data=np.random.randint(0,100,size=(5,6)))
df.replace(to_replace=5,value='five')
df.replace(to_replace={0:'zero'})
#将指定列的元素进行替换to_replace={列索引:被替换的值}
df.replace(to_replace={4:5},value='five')
映射操作
- 概念:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定(给一个元素值提供不同的表现形式)
- 创建一个df,两列分别是姓名和薪资,然后给其他名字起对应的英文名
- map是Series的方法,只能被Series调用
dic = {
'name':['张三','李四','张三'],
'salary':[15000,20000,15000]
}
df = DataFrame(data=dic)
#映射关系表
dic = {
'张三':'tom',
'李四':'jack'
}
df['e_name'] = df['name'].map(dic)
#该函数是我们指定的一个运算法则
def after_sal(s):#计算s对应的税后薪资
return s - (s-3000)*0.5
df['after_sal'] = df['salary'].map(after_sal)
#可以将df['salary']这个Series中每一个元素(薪资)作为参数传递给s
排序实现的随机抽样
- take()
- np.random.permutation()
df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B','C'])
#生成乱序的随机序列
np.random.permutation(10)
#将原始数据打乱
df.take([2,0,1],axis=1)#要用隐式索引,列打乱
df.take(np.random.permutation(3),axis=1)#列打乱
#行列一起打乱
df.take(np.random.permutation(3),axis=1).take(np.random.permutation(100),axis=0)
数据的分类处理
- 数据分类处理的核心:
- 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]
})
#想要水果的种类进行分组
df.groupby(by='item')
#查看详细的分组情况
df.groupby(by='item').groups
#计算每一种水果的平均价格
df.groupby(by='item').mean()
df.groupby(by='item')['price'].mean()
#计算每一种颜色对应水果的平均重量
df.groupby(by='color')['weight'].mean()
#将上一步获得的Series转化为字典
dic = df.groupby(by='color')['weight'].mean().to_dict()
#将计算出的平均重量汇总到源数据,字典映射
df['mean_w'] = df['color'].map(dic)
高级数据聚合
- 使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算
- df.groupby('item')['price'].sum()<->df.groupby ('item')['price'].apply(sum)
- transform和apply都会进行运算,在transform或者apply中传入函数即可
- transform和apply也可以传入一个lambda表达式
def my_mean(s):
m_sum=0
for i in s:
m_sum += i
return m_sum / len(s)
#transform会映射出来
df.groupby(by='item')['price'].transform(my_mean)
df.groupby(by='item')['price'].apply(my_mean)
数据加载
- 读取type-.txt文件数据
透视表
- 透视表是一种可以对数据动态排布并且分类汇总的表格格式。
- pandas中用pivot_table来使用
import pandas as pd
import numpy as np
df = pd.read_csv('./data/透视表-篮球赛.csv',encoding='utf8')
privot_table中有四个最重要的参数index、values、columns、aggfunc
- index参数:分类汇总的分类条件
- 每个privot_table必须拥有一个index。如果想查看对阵每个队伍的得分则需要对每一个队进行分类并计算其各类得分的平均值;
- 想看看对阵同一对手在不同主客场下的数据,分类条件为对手和主客场
df.pivot_table(index=['对手','主客场'])
- value参数:需要对计算的数据进行筛选
- 如果我们只需要在主客场和不同胜负情况下的得分、篮板与助攻三项数据
df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'])
- aggfunc参数:设置我们对数据聚合时进行的函数操作
- 当我们未设置aggfunc时,它默认aggfunc=‘mean’计算
df.pivot_table(index=['主客场','胜负'],values=['得分','篮板','助攻'],aggfunc='sum')
- columns:可以设置列层次字段
- 对values字段进行分类
#获取所有队主客场的总得分
df.pivot_table(index='主客场',values='得分',aggfunc='sum')
#获取每个队主客场的总得分,fill_value=0空值填充未0
df.pivot_table(index='主客场',values='得分',columns='对手',aggfunc='sum',fill_value=0)
交叉表
- 是一种用于计算分组的特殊透视图,对数据进行汇总
- pd.crosstab(index,colums)
- index:分组数据,交叉表的行索引
- columns:交叉表的列索引
import pandas as pd
from pandas import DataFrame
df = DataFrame({
'sex':['man','man','woman','woman','man','woman','man','woman','woman'],
'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]
})
#求出各个性别抽烟的人数
pd.crosstab(df.smoke,df.sex)
#求出各个年龄段抽烟人情况
pd.crosstab(df.age,df.smoke)