如何实现Pandas数据透视转换并解决crosstab索引异常与扁平化?
解决方法
首先你代码里有个明显错误:原DataFrame里的列是label,但你写了df.key,这会导致报错,先把这个改过来。
另外,pd.crosstab会把第一个参数(这里是df.id)设为结果的索引,这就是你说的「索引异常」问题。要把这个索引转成普通列,同时实现索引扁平化,只需要两步:
修正后的完整代码
import pandas as pd # 初始化示例DataFrame df = pd.DataFrame({'id':[1,2,1], 'label':['foo', 'baa', 'baa']}) # 用crosstab统计id与label的对应关系,注意列名是label不是key cross_df = pd.crosstab(df.id, df.label) # 把索引(id)转为普通列,同时重置行索引、去掉列轴的层级名称 result_df = cross_df.reset_index().rename_axis(None, axis=1) print(result_df)
代码说明
pd.crosstab(df.id, df.label):统计每个id对应各个label的出现次数,刚好符合你要的「出现过标1、没出现标0」的需求。reset_index():把原来作为索引的id转换为普通列,同时生成默认的行索引(0、1...)。rename_axis(None, axis=1):移除列轴的默认层级名称(label),实现列索引的扁平化。
输出结果
id baa foo 0 1 1 1 1 2 1 0
如果你的实际数据里,同一个id对应同一个label多次出现,crosstab会显示累计次数。要是你只需要0/1标记(不管出现几次都标1),可以再加一步处理:
result_df = result_df.apply(lambda x: x.where(x == 0, 1) if x.name != 'id' else x)
内容的提问来源于stack exchange,提问作者Faisal Hejary
相关产品推荐
相关产品推荐

