Pandas如何将固定长度拆分的列拼接为相邻块连字符格式多列
pandas按3字符分块拼接相邻块为多列的实现
问题场景
现有pandas列存储连续字符串,典型值为abcdefghi、abcdefghijkl、abcdefghijklmno这类长度为3的整数倍的字符串,需要输出多列,每列值为相邻两个3字符分块用-拼接的结果,对应关系如下:
- 输入
abcdefghi(长度9)输出2列:abc-def、def-ghi - 输入
abcdefghijkl(长度12)输出3列:abc-def、def-ghi、ghi-jkl - 输入
abcdefghijklmno(长度15)输出4列:abc-def、def-ghi、ghi-jkl、jkl-mno
当前已实现按3字符步长拆分字符串为独立分块,代码如下:
def split_chunk(txt, n=3): return [txt[i:i+n] for i in range(0, len(txt), n)] df = pd.DataFrame(df.COLUMN.apply(split_chunk).to_list())
拆分后的结果每列存一个3字符分块,空值对应长度不足的行,示例:
| 行索引 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 0 | abc | def | ghi | NaN | NaN |
| 1 | abc | def | ghi | jkl | NaN |
| 2 | abc | def | ghi | jkl | NaN |
| 3 | abc | def | ghi | jkl | mno |
| 4 | abc | def | ghi | NaN | NaN |
| 5 | abc | def | ghi | NaN | NaN |
解决方案
方法1:直接在拆分阶段生成目标结果(推荐)
不需要先生成分块中间表,拆分后直接拼接相邻块,代码更简洁效率更高:
import pandas as pd def split_to_pairs(txt, chunk_size=3): # 先按3字符拆分 chunks = [txt[i:i+chunk_size] for i in range(0, len(txt), chunk_size)] # 相邻块拼接,块数为k时输出k-1个拼接结果 return [f"{chunks[idx]}-{chunks[idx+1]}" for idx in range(len(chunks)-1)] # 直接生成目标多列结果 res_df = pd.DataFrame(df['COLUMN'].apply(split_to_pairs).to_list())
方法2:基于已有的分块中间表处理
如果已经生成了存分块的中间DataFrame(假设命名为chunk_df),可以逐列滑动拼接相邻非空值:
res_df = pd.DataFrame() col_count = chunk_df.shape[1] for col_idx in range(col_count - 1): # 只取当前列和下一列都非空的行做拼接,自动跳过空值行 valid_rows = chunk_df[[col_idx, col_idx+1]].dropna().index res_df.loc[valid_rows, col_idx] = chunk_df.loc[valid_rows, col_idx] + '-' + chunk_df.loc[valid_rows, col_idx+1]
两种方法最终输出结果完全匹配预期,示例如下:
| 行索引 | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| 0 | abc-def | def-ghi | NaN | NaN |
| 1 | abc-def | def-ghi | ghi-jkl | NaN |
| 2 | abc-def | def-ghi | ghi-jkl | NaN |
| 3 | abc-def | def-ghi | ghi-jkl | jkl-mno |
| 4 | abc-def | def-ghi | NaN | NaN |
| 5 | abc-def | def-ghi | NaN | NaN |
补充:如果原字符串长度不是3的整数倍,末尾不足3字符的残块会自动被过滤,不会参与拼接,符合相邻等长分块配对的逻辑。
内容的提问来源于stack exchange,提问作者Glammy
相关产品推荐
相关产品推荐

