一、
1、修改替换变量值
本质上是如何直接指定单元格的问题,只要能准确定位单元地址,就能够做到准确替换。
1.1 对应数值的替换
具体用法如下:
replace方法:
df.replace(to_replace = None :将被替换的原数值,所有严格匹配的数值将被用 value 替换,可以str/regex/list/dict/Series/numeric/Nonevalue = None :希望填充的新数值inplace = False
)
import pandas as pddata = {'Name': ['John', 'Alice', 'Bob', 'Emily', 'Tom'],'Age': [25, 30, 35, 40, 45]}
df = pd.DataFrame(data)
df['Age'] = df['Age'].replace({30: 32})
图示代码即创建5行2列的DateFrame,然后将Age列中的30替换成32
map方法:
将年龄为40岁及以上的人替换为老年人,年龄为25岁及以下的人替换为青年人,可以使用下列方法:
age_mapping = {25: '青年人', 30: '青年人', 35: '青年人', 40: '老年人', 45: '老年人'}
df['Age'] = df['Age'].map(age_mapping)
1.2 指定数值范围的替换
方法一:使用正则表达式完成替换
df.replace(regex, newvalue)
方法二:使用行筛选方式完成替换
用行筛选方式得到行索引,然后用 loc 命令定位替换,目前也支持直接筛选出单元格进行数值替换
# 使用正则匹配数据
df.开设.replace(regex = '不.+',value = '可以',inplace = True)# 这行代码使用正则表达式匹配'开设'列中以'不'开头的文本,并将其替换为'可以'
#iloc loc
df.支出.iloc[0:3] = 20 #这两行代码分别使用iloc和loc进行索引,将'支出'列中前3行的数据替换为20和30。
df.支出.loc[0:2] =30
#条件筛选替换
df.体重[df.体重>70] =70 #这行代码使用条件筛选,将'体重'列中大于70的数值替换为70。
df[df.体重==70].体重 = 80 #这行代码使用条件筛选找到'体重'列中值为70的行,并将其'体重'值替换为80。需要注意这种用法在一些情况下可能会引发SettingWithCopyWarning警告,可以使用.loc方法解决:df.loc[df.体重 == 70, '体重'] = 80
#query()的使用
df.query('性别 == "女" and 体重 > 60 ').体重 =50 #这行代码使用query查询语句筛选出满足'性别为女且体重大于60'的行,并将其'体重'值替换为50。同样需要注意引用问题,可以使用.loc方法解决:df.loc[df.query('性别 == "女" and 体重 > 60').体重.index, '体重'] = 50
df.loc[df.query('性别 == "女" and 体重 > 60').体重.index,'体重'] = 50
1.3虚拟变量变换
其使用方法如下:
pd.get_dummies(
data :希望转换的数据框/变量列
prefix = None :哑变量名称前缀
prefix_sep = 11 :前缀和序号之间的连接字符,设定有prefix 或列名时生效
dummy_na = False :是否为 NaNs 专门设定一个哑变量列
columns = None :希望转换的原始列名,如果不设定,则转换所有符合条件的列
drop_first = False :是否返回 k-l 个哑变量,而不是 k 个哑变量)#返回值为数据框
df2.head()#用于显示df2的前几行数据,以便我们了解数据的结构和内容。
pd.get_dummies(df2.类型,prefix = '_' )#这行代码将df2中的'类型'列进行独热编码,生成多个哑变量列,以'_类型'作为前缀,并返回编码后的DataFrame。例如,如果'类型'列有两个取值'A'和'B',则会生成两个哑变量列'_A'和'_B',其中相应的位置为1表示对应的取值存在,为0表示对应的取值不存在。
pd.get_dummies(df2 , columns= [ '类型' ])#直接对整个DataFrame进行操作,将'类型'列独热编码为多个哑变量列。这样可以同时对多个分类变量进行独热编码,生成相应的哑变量列。
2、数值变量分段
其具体用法如下:
pd.cut(X :希望逬行分段的变量列名称bins :具体的分段设定int :被等距等分的段数sequence of scalars :具体的每一个分段起点,必须包括最值,可不等距right = True :每段是否包括右侧界值labels = None :为每个分段提供自定义标签include_lowest = False :第一段是否包括最左侧界值,需要和right 参数配合
)#分段结果是数值类型为 Categories 的序列pd.qcut # 按均值取值范围进行等分
#按均值取值范围进行等分
df['cut1'] = pd.qcut(df.身高,q=5)#表示将df中的列身高按照相等频率来进行分段,分成5个区间。这里的相等频率指的是每个区间中包含的数据个数相同。返回的结果是一个Categorical类型的Series,表示每个数据所属的区间。这个结果会赋值给df['cut1']列。
#自定义分段
df['cut2'] = pd.cut(df.身高,bins=[150,160,170,180,190],right=False)#自定义分段,将"身高"分成4个区间,分别为[150,160),[160,170),[170,180),[180,190),并赋值给新的列"cut2"。right=False表示左闭右开区间,即不包含右边界值。
3、数据分组
df.groupby(by :用于分组的变量名/函数level = None :相应的轴存在多重索引时,指定用于分组的级别as_index = True :在结果中将组标签作为索引sort = True :结果是否按照分组关键字逬行排序
)#生成的是分组索引标记,而不是新的 df
dfg = df.groupby ('开设')
#查看dfg里面的数据
dfg.groups
#查看具体描述
dfg.describe( )
#按多列分组
dfg2 = df.groupby(['性别','开设'])
dfg2.mean ()
-
dfg.groups
可以查看dfg中的分组信息,返回一个字典,其中键表示分组的标签,值是该分组对应的行索引。 -
dfg.describe()
可以查看每个分组的具体描述统计信息,包括计数、均值、标准差、最小值、25%分位数、中位数、75%分位数、最大值等。 -
另外一段代码是将DataFrame按照"性别"和"开设"两列进行多级分组,将分组结果赋值给dfg2。
-
dfg2.mean()
对分组后的数据求均值,返回每个分组的平均值。结果是一个新的DataFrame,其中列名是原始DataFrame中的数值列名,索引是多级索引,分别包含"性别"和"开设"两列的不同取值组合。
dfgroup.get_group()
dfg.get_group ('不必要').mean ()
dfg.get_group ('不必要').std ()
dfg['身高'].max()
4、分组汇总
在使用 groupby 完成数据分组后,就可以按照需求进行分组信息汇总,此时可以使用其它专门的汇总命令,如 agg 来完成汇总操作。
df.aggregate( )
#名称可以直接简写为 agg
#可以用 axis 指定汇总维度
可以直接使用的汇总函数
dfg.agg( 'count')
dfg.agg('median')
dfg.agg(['mean', 'median'])
dfg.agg(['mean', 'median'])
#引用非内置函数
import numpy as np
df2.身高.agg (np. sum)
dfg.身高.agg (np. sum)
引用自定义函数:
# 使用自定义函数
def mynum(x:int) ->int:return x.min()
df2.身高.agg (mymean)
dfg.agg(mymean)
函数mynum(x:int) ->int
的定义中,参数x
是一个整数类型,函数返回值也是一个整数类型。
x.min()
表示对参数x
取最小值,并将最小值作为函数的返回值
.agg()是DataFrame对象的一个函数,用于对DataFrame中的某一列或多列应用一个或多个聚合函数。
df2表示DataFrame df2 中的名为"身高"的列,mynean是自定义的聚合函数,它会被应用于"身高"这一列,并返回最小值
dfg 是另一个DataFrame对象。相同地,.agg()函数将会对dfg 中的所有列应用mymean这个聚合函数,并返回每列的最小值。