You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Pandas代码实现透视表频次值按组唯一显示?

问题:如何在Pandas透视表中避免频次值重复显示

原始DataFrame

Name  Number  File_name  Frequency
0    A  item 1     path 1          2
1    A  item 1     path 2          2
2    A  item 2     path 1          4
3    A  item 2     path 2          4
4    A  item 3     path 1          1
5    A  item 2     path 3          4
6    A  item 2     path 4          4

预期输出格式

Name      Number    File_name      Frequency   
    A         item 1     path 1            2 
                         path 2
              item 2     path 1            4 
                         path 2
                         path 3
                         path 4
              item 3     path 1            1

当前尝试代码及结果

尝试代码:

df = pd.read_excel(path)
df["Unique ID"] = df["Name"] + " " + df["Number"]  # 创建额外列计算频次
df['frequency'] = df['Unique ID'].map(df['Unique ID'].value_counts())

pivot = pd.pivot_table(df, 
                       index=["Name", "Number", "File_name"],
                       values="frequency", 
                       fill_value=0)

print(pivot)

得到的结果:

Name      Number    File_name      Frequency   
    A         item 1     path 1            2 
                         path 2            2
              item 2     path 1            4 
                         path 2            4
                         path 3            4
                         path 4            4
              item 3     path 1            1

解决方案

Pandas默认透视表会重复显示层级内的相同值,要实现预期的合并显示效果,分两种场景处理:

场景1:Jupyter/HTML环境(可视化显示)

可以利用Pandas的style功能隐藏重复的频次值:

# 先生成你的透视表
pivot = pd.pivot_table(df, 
                       index=["Name", "Number", "File_name"],
                       values="Frequency", 
                       fill_value=0)

# 标记需要隐藏的重复频次行:同一(Name, Number)组内,除第一个File_name外的其他行
mask = pivot.groupby(level=['Name', 'Number'])['Frequency'].transform(lambda x: x.duplicated())

# 应用样式隐藏重复值
styled_pivot = pivot.style.apply(
    lambda x: ['visibility: hidden' if v else '' for v in mask],
    subset=['Frequency']
)

# 显示处理后的结果
display(styled_pivot)

场景2:终端/命令行输出(文本格式)

需要手动遍历数据,控制重复值的显示:

# 先重置索引方便遍历
pivot_df = pivot.reset_index()

# 初始化变量记录上一行的值
prev_name = None
prev_number = None
prev_freq = None

# 打印表头
print(f"{'Name':<8} {'Number':<10} {'File_name':<10} {'Frequency':<10}")

# 遍历每一行,控制重复值显示
for _, row in pivot_df.iterrows():
    # 仅当当前值与上一行不同时显示,否则留空
    display_name = row['Name'] if row['Name'] != prev_name else ''
    display_number = row['Number'] if row['Number'] != prev_number else ''
    display_freq = row['Frequency'] if row['Frequency'] != prev_freq else ''
    
    # 打印当前行
    print(f"{display_name:<8} {display_number:<10} {row['File_name']:<10} {display_freq:<10}")
    
    # 更新上一行记录
    prev_name = row['Name']
    prev_number = row['Number']
    prev_freq = row['Frequency']

终端输出结果:

Name     Number     File_name  Frequency  
A        item 1     path 1     2          
                    path 2                
         item 2     path 1     4          
                    path 2                
                    path 3                
                    path 4                
         item 3     path 1     1          

内容的提问来源于stack exchange,提问作者SMS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:39:14