通用方法写法
python
import pandas as pd
from collections.abc import Iterable
def flatten_unique(series):
"""
将Series中的元素(可能是列表或单值)展平、去重,返回列表。
参数:
series: pandas.Series
返回:
list 去重后的展平列表
"""
# 展平
flat_list = []
for v in series:
if isinstance(v, Iterable) and not isinstance(v, (str, bytes)):
flat_list.extend(v) # 如果是列表或其他可迭代
else:
flat_list.append(v) # 如果是单个值
# 去重并去掉 None
return list(pd.unique([i for i in flat_list if pd.notna(i)]))
使用示例
ini
df_result = (
df_kong_sorted.groupby(["modelCode", "originalModel"], as_index=False)
.agg(
first_year=("year", "first"),
first_week=("week", "first"),
last_year=("year", "last"),
last_week=("week", "last"),
sum_amount=("total", "sum"),
sum_volume=("count", "sum"),
record_mark=("recordMark", flatten_unique)
)
)
如果你需要返回字符串而不是列表
可以再写一个包装函数:
python
def flatten_unique_str(series, sep=","):
return sep.join(map(str, flatten_unique(series)))
这样可以直接:
ini
record_mark=("recordMark", lambda x: flatten_unique_str(x, sep=";"))
这个方法的好处:
- 通用:任何 DataFrame 分组聚合都能用
- 类型兼容 :
recordMark
里既有 list 又有单个字符串都能处理 - 自动去重:避免重复值
- 可扩展 :需要拼接成字符串时直接调用
flatten_unique_str