当DataFrame的Tags列长度超6位时,如何拆分标签并复制对应行?
我明白你的需求啦——你不仅要清理Tags列里的非数字字符,还要把长度超过6位的标签拆成每6位一组,同时复制对应行的其他数据对吧?咱们一步步来搞定这个问题。
第一步:先做Tags列的基础清理
首先优化你的现有代码,先把Tags列转成纯数字的字符串,去掉所有非数字字符:
import pandas as pd # 你的示例数据 df = pd.DataFrame( {'user': ['Ticket ID', 'Closed Time', 'Tags'], 'income': [1, 2, 3], 'Closed Time': ['08/19/20', '08/18/20', '08/17/20'], 'Tags': [270201, 284912, 123456789101]} ) # 清理Tags:保留纯数字,转为字符串 df['Tags'] = df['Tags'].astype(str).str.replace(r'[^0-9]+', '', regex=True)
第二步:拆分超长标签并展开行
接下来是核心操作:把每个超长的标签按6位分割,然后把这些分割后的标签拆成单独的行,同时保留原行的其他所有数据。这里用apply+explode组合来实现:
# 定义拆分函数:把字符串按每6位分割成列表 def split_long_tags(tag_str): # 从索引0开始,每6位取一段,直到字符串末尾 return [tag_str[i:i+6] for i in range(0, len(tag_str), 6)] # 给Tags列赋值为拆分后的列表,然后用explode展开成多行 df_expanded = df.assign(Tags=df['Tags'].apply(split_long_tags)).explode('Tags', ignore_index=True)
第三步:统一标签为6位(可选)
如果你希望所有标签都严格是6位(包括拆分后不足6位的片段),可以用str.zfill(6)来补前导零:
df_expanded['Tags'] = df_expanded['Tags'].str.zfill(6)
最终效果
运行完上面的代码后,你的df_expanded会变成这样:
| user | income | Closed Time | Tags |
|---|---|---|---|
| Ticket ID | 1 | 08/19/20 | 270201 |
| Closed Time | 2 | 08/18/20 | 284912 |
| Tags | 3 | 08/17/20 | 123456 |
| Tags | 3 | 08/17/20 | 789101 |
可以看到原来的超长标签123456789101被拆成了123456和789101,对应的其他列内容也被复制了一份。
内容的提问来源于stack exchange,提问作者Matt Topic
相关产品推荐
相关产品推荐

