R语言基于分组统计多列不同置信等级占比的实现方法
你可以用Python的Pandas库完成该数据转换需求,具体实现代码如下:
import pandas as pd import numpy as np # 此处为构造的示例数据,实际使用时替换为你自己的df即可 data = { 'ID': [1]*8, 'Asset': ['A','B','C','D','E','F','G','H'], 'CONF_1': ['PERFECT','PERFECT','LOW',np.nan,'MEDIUM','MEDIUM','VERY LOW',np.nan], 'CONF_2': ['HIGH','LOW','HIGH','MEDIUM','MEDIUM','VERY LOW','VERY LOW','PERFECT'], 'CONF_3': ['LOW','LOW','VERY LOW','MEDIUM','PERFECT',np.nan,'VERY LOW','HIGH'] } df = pd.DataFrame(data) # 每个CONF列总共有8条记录 total = len(df) # 宽表转长表方便分组统计 melt_df = df.melt(id_vars='ID', value_vars=['CONF_1','CONF_2','CONF_3'], var_name='conf_col', value_name='CONFIDENCE') # 把空值替换为字符串NA方便统一统计 melt_df['CONFIDENCE'] = melt_df['CONFIDENCE'].fillna('NA') # 分组统计各等级出现次数并计算占比 stat_df = melt_df.groupby(['ID', 'conf_col', 'CONFIDENCE'], dropna=False).size().reset_index(name='cnt') stat_df['pct'] = stat_df['cnt'] / total * 100 # 长表转回期望的宽表格式 res_df = stat_df.pivot(index=['ID', 'CONFIDENCE'], columns='conf_col', values='pct').reset_index().fillna(0) # 格式化列名和百分比输出 res_df = res_df.rename(columns={'CONF_1':'CONF_1 %', 'CONF_2':'CONF_2 %', 'CONF_3':'CONF_3 %'}) res_df = res_df[['ID', 'CONFIDENCE', 'CONF_1 %', 'CONF_2 %', 'CONF_3 %']] # 可选:将数值转为带%的字符串格式 for col in ['CONF_1 %', 'CONF_2 %', 'CONF_3 %']: res_df[col] = res_df[col].apply(lambda x: f"{x} %".replace('.0', '') if x != 0 else '0') print(res_df)
运行上述代码即可得到你要求的统计结果。
内容的提问来源于stack exchange,提问作者Dinho
相关产品推荐
相关产品推荐

