为了快速应用将python 数据处理中的高频功能封装成函数,方便使用。
一、分类
1、多条件判断
本身没有难度,就是写起来繁琐,这里做个模板,方便复制和粘贴。
def fill_data_category(row):
if row['无线协议'] == 'Wi-Fi 5' and row['带宽'] == 80:
return 'C1'
elif row['无线协议'] == 'Wi-Fi 6' and row['频段'] == '2.4G' and row['带宽'] == 20:
return 'C2'
elif row['无线协议'] == 'Wi-Fi 6' and row['频段'] == '5G' and row['带宽'] == 80:
return 'C3'
else:
return '其他'
二、分组聚合
1、单列或者多列聚合
关键在构建agg_dict,conditions 和target_col只有一个元素时可以写成字符串而不是列表。但是只有一个统计方法也要写成列表 例如 agg_dict={“电平”:[“mean”]} 不能写成agg_dict={“电平”:“mean”}否则列名会出错。
原因为
df.columns = df.columns.map(lambda x: '-'.join(x) if '' not in x else x[0])
是处理复核索引表头,如果写成会字符串则无法形成复合索引导致表头错误。
常见的agg_dict方法
1、单列多个统计 agg_dict={“列名”:[“mean”,“sum”,“count”]}
2、多列单个统计,统计方式一样 lst_c 为列名列表,agg_dict= {col: [“mean”] for col in lst_c}
3、多列多个统计,统计方式一样 lst_c 为列名列表,agg_dict= {col: [“mean”, “sum”] for col in lst_c}
4、多列多个不同的统计。
#要分组的字段
conditions = "频段"
#分组后要聚合计算的列
target_col="电平"
#聚合字典,字段和聚合方法的对应关系
agg_dict={"电平":["mean"]}
def df_groupby(df,conditions,target_col,agg_dict):
df = df.groupby(conditions).agg(agg_dict)
df=df.reset_index()
#修改列名,让表头变为 列名和统计方法使用“-”相连,而不是原来的符合索引
df.columns = df.columns.map(lambda x: '-'.join(x) if '' not in x else x[0])
return df
3、聚合成一条数据
各需要聚合的列,先组成字符串在聚合
def groupby_s(df,conditions,target_col,aggregation):
df["group_col"] = df[conditions].astype(str).apply(lambda x: '/'.join(x), axis=1)
df = df.groupby("group_col").agg({ target_col: aggregation })
df=df.reset_index()
col_name=["group_col"]+aggregation
df.columns=col_name
return df
三、数据透视表
index=[‘频段’,“带宽”]
values=‘电平’
columns=‘测试场景’
agg=“mean”
index和agg既可以是单独的字段也可以是列表
def df_pivot(df, index, values, columns,agg):
df = pd.pivot_table(df, values=values, index=index, columns=columns, aggfunc=agg)
df=df.reset_index()
return df
四、加权平均数
计算加权平均数,权重是频数
def weighted_average(series):
# 计算每个值的数量
value_counts = dict(series.value_counts())
# 计算总数
total_count = len(series)
# 初始化加权和为0
weighted_sum = 0
# 使用for循环遍历dict的每个值,并计算加权和
for key, value in value_counts.items(): # 添加`.items()`以正确遍历字典
weighted_sum += key * value
# 计算加权平均数
weighted_ave = weighted_sum / total_count
return weighted_ave