如何在Python中从DataFrame格式的列联表重构DataFrame?
从列联表重构DataFrame的方法
生成df1(行列+频率的三列格式)
完全不用写循环,用Pandas的stack()方法就能快速实现:
import pandas as pd ctab = pd.DataFrame([[1,2], [2, 1]], columns=["A", "B"], index=["A", "B"]) # 生成目标df1 df1 = ctab.stack().reset_index(name='freq') df1.columns = ['col', 'index', 'freq'] print(df1)
运行后输出的结果和你定义的df1完全一致,stack()会自动把列联表的行索引、列名和对应数值展开,再通过reset_index()把索引转成列,最后重命名列即可。
生成df2(按频率重复行列组合)
同样不需要循环,基于df1的结果用repeat()方法就能实现:
# 生成目标df2 df2 = df1.loc[df1.index.repeat(df1['freq']), ['col', 'index']].reset_index(drop=True) print(df2)
这里通过df1.index.repeat(df1['freq'])生成与频率匹配的重复索引,提取对应行的col和index列后,重置索引就得到了目标格式。
如果想一步到位不依赖df1,也可以直接操作堆叠后的结果:
# 一步生成df2 stacked_ctab = ctab.stack() df2 = pd.DataFrame({ 'col': stacked_ctab.index.get_level_values(0).repeat(stacked_ctab.values), 'index': stacked_ctab.index.get_level_values(1).repeat(stacked_ctab.values) }).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者sigbert
相关产品推荐
相关产品推荐

