如何用Pandas实现按Date和ID分组且不重复显示对应值?
实现重复Date/ID单元格空白的分组显示方案
核心思路是标记重复的Date和ID行,将这些重复行的对应单元格设为空值,既保留所有原始数据,又能实现分组后不重复显示的效果,最终直接导出Excel即可。
步骤1:还原示例DataFrame
先复现你的数据结构:
import pandas as pd data = { 'Date': ['01-01-2023', '01-01-2023', '01-01-2023', '02-01-2023', '02-01-2023', '02-01-2023'], 'ID': ['123', '123', '839', '123', '942', '942'], 'Brand': ['Apple', 'Microsoft', 'Oneplus', 'Samsung', 'LG', 'Samsung'], 'Product': ['Macbook', 'Surface', '9T', 'S10', 'V10', 'S23'] } df = pd.DataFrame(data)
步骤2:处理重复的Date和ID
用duplicated()方法判断重复项,将重复的分组单元格替换为空字符串:
# 仅保留每个Date的第一行显示,其余重复Date设为空 df['Date'] = df['Date'].where(~df['Date'].duplicated(), '') # 按Date分组后,仅保留每组内每个ID的第一行显示,其余重复ID设为空 df['ID'] = df.groupby('Date')['ID'].transform(lambda x: x.where(~x.duplicated(), ''))
处理后的DataFrame效果如下:
| Date | ID | Brand | Product |
|---|---|---|---|
| 01-01-2023 | 123 | Apple | Macbook |
| Microsoft | Surface | ||
| 839 | Oneplus | 9T | |
| 02-01-2023 | 123 | Samsung | S10 |
| 942 | LG | V10 | |
| Samsung | S23 |
步骤3:导出至Excel
直接使用Pandas的导出方法,注意关闭索引列:
df.to_excel('grouped_output.xlsx', index=False)
补充说明
- 该方案完全保留原始数据,仅修改分组列的重复显示,符合Excel中常见的分组排版需求。
- 若后续需要恢复原始数据,只需保留最初的DataFrame副本即可,修改操作未影响原始数据结构。
内容的提问来源于stack exchange,提问作者Bearishcat
相关产品推荐
相关产品推荐

