如何使用Pandas将频率表还原为整洁格式数据
解决方法:用
melt+repeat还原计数型宽表为整洁数据 嘿,这个需求我太熟了!要把这种按计数存储的宽表转成每行对应一个实例的整洁格式,用pandas的melt配合索引重复就能一步到位,代码简洁又高效。
完整实现代码
import pandas as pd # 初始化你的数据 data = [[1,1,2,3], [1,2,3,5], [2,1,6,1], [2,2,2,4]] df = pd.DataFrame(data, columns=['id', 'time', 'CountX1', 'CountX2']) # 核心链式操作 clean_df = ( # 第一步:把宽表转成长表,提取变量名和对应计数 df.melt(id_vars=['id', 'time'], var_name='variable', value_name='count') # 第二步:根据计数值重复每一行 .loc[lambda x: x.index.repeat(x['count'])] # 第三步:删除不需要的计数列 .drop('count', axis=1) # 第四步:重置索引,得到干净的结果 .reset_index(drop=True) # 可选:把variable列的"Count"前缀去掉,变成你要的X1/X2 .assign(variable=lambda x: x['variable'].str.replace('Count', '')) ) print(clean_df)
步骤拆解
melt转长表:id_vars指定要保留的标识列(id和time),var_name把原来的列名(CountX1/CountX2)存到variable列,value_name把对应的计数值存到count列,这一步先把宽表结构拆成便于处理的长表。repeat重复行:利用index.repeat(x['count']),让每一行根据自己的计数值重复对应次数,比如原来CountX1=2的行,会被复制2次。- 清理列和索引:删掉没用的
count列,再重置索引,避免重复索引的问题。 - 可选的变量名优化:用
str.replace把variable列的"Count"前缀去掉,正好得到你要的X1/X2格式。
运行后得到的结果完全符合你要求的整洁数据格式,每一行对应一个实例,完美还原计数信息~
内容的提问来源于stack exchange,提问作者user3637203
相关产品推荐
相关产品推荐

