请求实现按日期累积字符串列唯一值的功能
问题描述
现有包含日期列(A列)与字符串值列(B列)的数据集,原始数据如下:
| A | B | |
|---|---|---|
| 1 | 01/02/23 | apple |
| 2 | 01/02/23 | pear |
| 3 | 01/02/23 | apple |
| 4 | 02/02/23 | apple |
| 5 | 02/02/23 | apple |
| 6 | 02/02/23 | banana |
| 7 | 02/02/23 | banana |
| 8 | 02/02/23 | apple |
需要实现按唯一日期分组,每日累积包含此前所有日期出现过的B列唯一字符串,期望输出如下:
| A | B | |
|---|---|---|
| 1 | 01/02/23 | apple |
| pear | ||
| 1 | 02/02/23 | apple |
| pear | ||
| banana |
尝试过基础累积方法,但针对字符串值无法得到预期结果,寻求可行方案。
解决方案一:Excel Power Query 实现
Power Query适合可视化处理这类累积去重分组需求,步骤如下:
- 选中数据区域,点击「数据」选项卡 → 「从表格/区域」,将数据导入Power Query编辑器。
- 提取每日唯一B值:
- 点击「转换」→「分组依据」,分组列选
A,新列名设为「每日唯一B」,操作选择「所有行」。 - 对「每日唯一B」列,右键选择「转换」→「提取唯一值」,得到每个日期对应的唯一字符串列表。
- 点击「转换」→「分组依据」,分组列选
- 构建累积唯一值列表:
- 添加自定义列,输入公式:
该公式会累积当前日期及之前所有日期的唯一B值。List.Accumulate(List.Range(#"分组依据"[A], 0, List.PositionOf(#"分组依据"[A], [A]) + 1), {}, (state, current) => List.Distinct(state & Table.SelectRows(#"分组依据", each [A] = current)[每日唯一B]{0}))
- 添加自定义列,输入公式:
- 展开累积列表:点击累积列的展开按钮,选择「到新行」。
- 调整日期列格式:
- 添加索引列,再添加自定义列判断是否为当前日期组的第一行,是则保留日期,否则为空。
- 删除原日期列和索引列,将自定义列重命名为
A。
- 关闭并上载到Excel,即可得到目标格式。
解决方案二:Python pandas 代码实现
如果用代码处理,pandas可快速完成需求:
import pandas as pd # 加载原始数据(实际使用时可替换为pd.read_excel/pd.read_csv读取文件) df = pd.DataFrame({ 'A': ['01/02/23']*3 + ['02/02/23']*5, 'B': ['apple', 'pear', 'apple', 'apple', 'apple', 'banana', 'banana', 'apple'] }) # 提取每个日期对应的唯一B值 daily_unique = df.groupby('A')['B'].unique().reset_index() # 构建累积唯一值集合 cumulative_data = [] seen_items = set() for _, row in daily_unique.iterrows(): seen_items.update(row['B']) cumulative_data.append({'A': row['A'], 'B': list(seen_items)}) # 转换为目标格式的DataFrame result = pd.DataFrame(cumulative_data).explode('B').reset_index(drop=True) # 处理日期列:仅保留每组第一行的日期,其余单元格为空 result['A'] = result.groupby('A')['A'].transform(lambda x: x.iloc[0] if x.name == x.iloc[0] else '') print(result)
运行代码后输出结果:
A B 0 01/02/23 apple 1 pear 2 02/02/23 apple 3 pear 4 banana
内容的提问来源于stack exchange,提问作者SKR0121
相关产品推荐
相关产品推荐

