如何按指定条件合并Pandas DataFrame同文档行至最大长度
Pandas按文档分组合并字符串(控制最大长度)
原始数据
| Doc | String |
|---|---|
| A | abc |
| A | def |
| A | ghi |
| B | jkl |
| B | mnop |
| B | qrst |
| B | uv |
合并规则
- 仅合并同一
Doc下的字符串 - 合并后的单条字符串长度不能超过指定的
max_len(示例取max_len=6)
预期输出
| Doc | String |
|---|---|
| A | abcdef |
| A | defghi |
| B | jkl |
| B | mnop |
| B | qrstuv |
实现代码
import pandas as pd def batch_merge(group, max_len): batches = [] current_batch = "" for s in group["String"]: # 如果加上当前字符串会超限,先把现有批次存起来 if len(current_batch + s) > max_len: if current_batch: batches.append(current_batch) # 单个字符串超长的情况直接保留(按需调整) if len(s) > max_len: batches.append(s) current_batch = s else: current_batch += s # 收尾最后一个批次 if current_batch: batches.append(current_batch) # 返回当前文档对应的结果DataFrame return pd.DataFrame({ "Doc": [group.name] * len(batches), "String": batches }) # 构造原始DataFrame df = pd.DataFrame({ "Doc": ["A", "A", "A", "B", "B", "B", "B"], "String": ["abc", "def", "ghi", "jkl", "mnop", "qrst", "uv"] }) # 设置最大长度阈值 max_len = 6 # 分组处理后拼接结果 final_df = df.groupby("Doc").apply(batch_merge, max_len=max_len).reset_index(drop=True) print(final_df)
逻辑说明
- 针对每个
Doc分组,逐个遍历字符串,累加拼接成“批次” - 当当前批次加上下一个字符串会超过
max_len时,先保存现有批次,再开启新批次 - 最后把剩余的批次补上,保证所有字符串都被处理
- 单个字符串本身超过
max_len的情况,这里直接保留原字符串,可根据实际需求调整(比如截断)
内容的提问来源于stack exchange,提问作者oettam_oisolliv
相关产品推荐
相关产品推荐

