python每日学习14:pandas库的用法
python每日学习14:pandas库的用法(3)
修改替换变量值
本质上是如何直接指定单元格的问题,只要能准确定位单元地址,就能够做到准确替换。
import pandas as pd
df=pd.DataFrame({'name':['zs','ls','we'],'weight':[78,70,85],'age':[34,45,29]})
# df.weight[1]=33
# df['weight'][1]=68
# df.loc[1,'weight']=55
# df.weight[df.weight.isin([77,88,55])]=99
对应数值的替换
df.replace(,to_replace = None,str/regex/list/dict/Series/numeric/Nonevalue = None,inplace = False)
df.age.replace(554,45,inplace=True)
df.age.replace([34,29],[0,1],inplace=True)#age列的值从34和29替换为0和1
df.age.replace({34:'abc',29:'edc'},inplace=True)列的值从34和29替换为字符串'女'和'
————————————————
指定数值范围的替换
方法一:使用正则表达式完成替换:df.replace(regex, newvalue)。
方法二:使用行筛选方式完成替换,用行筛选方式得到行索引,然后用 loc 命令定位替换目前也支持直接筛选出单元格进行数值替换。
注意:query 命令的类 SQL 语句可以逬行检索,但不直接支持数值替换。
import pandas as pd# 创建一个示例DataFrame
data = {'姓名': ['张三', '李四', '王五', '赵六'],'性别': ['男', '女', '女', '男'],'体重': [65, 72, 75, 60],'开设': ['不清楚', '不错', '不行', '不感兴趣'],'支出': [100, 100, 100, 100] # 添加支出列用于演示
}
df = pd.DataFrame(data)# 使用正则匹配数据
df.开设.replace(regex = '不.+',value = '可以',inplace = True)#使用正则表达式匹配以“不”开头的字符串。将匹配到的字符串替换为“可以”
#iloc loc
df.支出.iloc[0:3] = 20
df.支出.loc[0:2] =30
#条件筛选替换
df.体重[df.体重>70] =70# #query()的使用df.loc[df.query('性别 == "女" and 体重 > 60').体重.index,'体重'] = 50
虚拟变量变换
pd.get_dummies(,data,prefix = None,prefix_sep = 11 ,prefix,dummy_na = False ,columns = None,drop_first = False,)#返回值为数据框。
import pandas as pd
data = {'id': [1, 2, 3, 4],'类型': ['A', 'B', 'A', 'C']
}
df2 = pd.DataFrame(data)# 查看DataFrame的前几行
df2.head()# 为单个列创建虚拟变量
pd.get_dummies(df2.类型, prefix='_')# 为多个列创建虚拟变量
pd.get_dummies(df2, columns=['类型'])
数值变量分段
pd.cut(,X ,bins,int,sequence of scalars ,right = True,labels = None,include_lowest = False,right ,)#分段结果是数值类型为 Categories 的序列。pd.qcut # 按均值取值范围进行等分。
X :希望逬行分段的变量列名称
bins :具体的分段设定
int :被等距等分的段数
sequence of scalars :具体的每一个分段起点,必须包括最值,可不等距
right = True :每段是否包括右侧界值
labels = None :为每个分段提供自定义标签
include_lowest = False :第一段是否包括最左侧界值,需要和right 参数配合
import pandas as pd
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'身高': [165, 175, 160, 180]
}
df = pd.DataFrame(data)
# 按均值取值范围进行等分
df['cut1'] = pd.qcut(df.身高, q=5)
# 自定义分段
df['cut2'] = pd.cut(df.身高, bins=[150, 160, 170, 180, 190], right=False)
print(df)
数据分组
df.groupby(,by , level = None ,as_index = True,sort = True,)#生成的是分组索引标记,0而不是新的 df。by :用于分组的变量名/函数
level = None :相应的轴存在多重索引时,指定用于分组的级别
as_index = True :在结果中将组标签作为索引
sort = True :结果是否按照分组关键字逬行排序
import pandas as pd# 创建一个示例DataFrame
data = {'姓名': ['张三', '李四', '王五', '赵六'],'性别': ['男', '女', '女', '男'],'体重': [65, 72, 75, 60],'开设': ['可以', '可以', '不清楚', '不感兴趣']
}
df = pd.DataFrame(data)# 按'开设'列分组
dfg=df.groupby('开设')
dfg.groups# 查看分组的描述性统计
dfg.describe()# 按'性别'和'开设'列分组
dfg2 = df.groupby(['性别', '开设'])
dfg2.groups# 查看多列分组的均值
df.groupby(['开设'])['体重'].mean()
分组汇总
在使用 groupby 完成数据分组后,就可以按照需求进行分组信息汇总,此时可以使用其它专门的汇总命令,如 agg 来完成汇总操作。
使用 agg 函数进行汇总df.aggregate( ),名称可以直接简写为 agg,可以用 axis 指定汇总维度,可以直接使用的汇总函数。
count(): 计算非空观测值的数量。
size(): 计算组的大小,即组内元素的数量。
sum(): 计算值的总和。
mean(): 计算值的平均值。
median(): 计算值的中位数,即按大小排序后位于中间位置的值。
min(): 找出值中的最小值。
max(): 找出值中的最大值。
std(): 计算值的无偏标准差,即样本标准差。
var(): 计算值的无偏方差。
skew(): 计算值的无偏偏度(第三阶矩)。
kurt(): 计算值的无偏峰度(第四阶矩)。
quantile(): 计算样本的分位数,即指定百分比位置的值。
apply(): 通用应用函数,允许对数据集执行自定义操作。
cov(): 计算两个变量的无偏协方差。
corr(): 计算两个变量的相关系数。
import pandas as pd
import numpy as np
data = {
'姓名': ['张三', '李四', '王五', '赵六'],
'性别': ['男', '女', '女', '男'],
'体重': [65, 72, 75, 60],
'身高': [175, 165, 160, 180],
'开设': ['可以', '可以', '不清楚', '不感兴趣']
}
df = pd.DataFrame(data)
# 按'开设'列分组
dfg = df.groupby('开设')
dfg.agg('count')
处理缺失值
# 认识缺失值
# 系统默认的缺失值 None 和 np. nan
data=pd.Series([3,4,np.nan,1,5,None])
df=pd.DataFrame([[1,2,None],[4,np.nan,6],[5,6,7]])# 缺失值查看
# 直接调用info()方法就会返回每一列的缺失情况。
df.info()# 还可以用isnull()方法来判断哪个值是缺失值,如果是缺失值则返回
# True,如果不是缺失值返回False。
# df.isna(): 检查相应的数据是否为缺失值 同 df.isnull()。
# df.notna()等同于notnull()
df.isnull()
df.isna()
df[df.isnull()]
df[df.notnull()]# 检查多个单元格的取值是否为指定缺值
# df.any(
# axis : index (0), columns (1)
# skipna = True :检查时是否忽略缺失值
# level = None :多重索引时指定具体的级别
# )
# df.all(
# axis : index (0), columns (1)
# skipna = True :检查时是否忽略缺失值
# level = None :多重索引时指定具体的级别
# )
#默认检测的是列值
df.isna().any()
填充缺失值
调用fillna()方法对数据表中的所有缺失值进行填充,在fillna()方法中输入要填充的值。还可以通过
method参数使用前一个数和后一个数来进行填充。df.fillna(,value ,dict/Series/DataFrame ,method = None ,limit = None,axis : index (0), columns (1),inplace = False)。value :用于填充缺失值的数值,也可以提供
dict/Series/DataFrame 以进—步指明哪些索引/列会被替换 不能使用 list
method = None :有索引时具体的填充方法,向前填充,向后填充等
limit = None :指定了 method 后设定具体的最大填充步长,此步长不能填充
axis : index (0), columns (1)
inplace = False
# Series对象缺失值填充
df=pd.Series([3,4,np.nan,1,5,None])# 以0进行填充:
df.fillna(0)# 以前一个数进行填充
df.fillna(method='ffill')# 以后一个数进行填充:
df.fillna(method='bfill')# 先按前一个,再按后一个
df.fillna(method='bfill').fillna(method='ffill')# DataFrame对象缺失值填充
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])# 使用数值0来填充
df.fillna(0)
# 使用行的前一个数来填充
df.fillna(method='ffill')
# 使用列的后一个数来填充
df.fillna(method='bfill' ,axis=1)
删除缺失值
调用dropna()方法删除缺失值,dropna()方法默认删除含有缺失值的行,也就是只要某一行有缺失值就把这一行删除。如果想按列为单位删除缺失值,需要传入参数axis=’columns’。
df.dropna(,axis = 0,how = any,any ,all ,thresh = None,int,subset,inplace = False )axis = 0 : index (0), columns (1)
how = any : any、all
any :任何一个为 NA 就删除
all :所有的都是 NA 删除
thresh = None :删除的数量阈值,
int
subset :希望在处理中包括的行/列子集
inplace = False
# 删除缺失值
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])# 默认为以行为单位剔除
df.dropna()
# 以列为单位剔除
df.dropna(axis='columns')# 删除空白行
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])# 所有为nan时候才剔除
df.dropna(how='all')
df.dropna(how='any')
数据查重
import pandas as pd
# 创建一个示例DataFrame
data = {'姓名': ['张三', '李四', '王五', '赵六', '张三'],'课程': ['数学', '数学', '英语', '物理', '数学'],'开设': ['可以', '可以', '可以', '不感兴趣', '可以'],'成绩': [88, 92, 85, 91, 93]
}
df = pd.DataFrame(data)# 标识出重复的行
# 标识出重复行的意义在于进一步检査重复原因,以便将可能的错误
# 数据加以修改
# Duplicated
df['dup'] = df.duplicated(['课程', '开设'], keep=False)# 利用索引进行重复行标识
# df.index.duplicated()
df2 = df.set_index ( ['课程','开设'] )
df2.index.duplicated ()# 直接删除重复的行
# drop_duplicates (
# subset=“ ”按照指定的行逬行去重
# keep='first' 、 'last' 、 False 是否直接删除有重复的所有记录
# )
df. drop_duplicates ( ['课程', '开设' ] )
df. drop_duplicates ( ['课程', '开设' ] , keep= False )# 利用査重标识结果直接删除
# df[~df.duplicated( )]
df[~df . duplicated ( ['课程', '开设' ] )]