如何用Pandas无循环按'^'将行内数据拆分至列?
使用Pandas无循环拆分内容至不同列
需求说明
需在不使用循环的前提下,将包含字符^的行作为列名,后续行的内容分别归入对应列中,直至遇到下一个含^的行。
现有数据
0 A^ 3 206-1C 4 502-2B 5 506-0.5C 6 604-1B 7 907-2B 8 G.ELITE^ 9 A201-1C 10 A202-1B
期望输出
| A^ | G.ELITE^ |
|---|---|
| 206-1C | A201-1C |
| 502-2B | A202-1B |
| 506-0.5C | |
| 604-1B | |
| 907-2B |
(注:原期望输出中的末尾点号推测为笔误,此处按合理内容调整;若需保留点号,可在最终结果中追加处理)
已尝试代码
test=rd.query('texts.str.contains("\^")', engine='python')
解决方案
我们可以通过标记分组、填充列名、重塑表格的方式实现,全程无需循环:
- 标记每行所属的目标列:识别含
^的行作为列名,并用向前填充的方式为后续行分配对应列名 - 过滤掉原列名行:移除那些仅作为列名的行
- 生成组内行索引:为每个列组内的行分配连续索引,用于后续重塑表格
- 重塑为目标格式:通过
pivot方法将数据转换为列名对应、行内容匹配的表格
具体代码如下:
import pandas as pd # 假设原始数据存储在名为rd的DataFrame中,列名为'texts' # 标记每行对应的目标列名 rd['col_name'] = rd['texts'].where(rd['texts'].str.contains('\^')).ffill() # 过滤掉作为列名的原始行 filtered_data = rd[~rd['texts'].str.contains('\^')].copy() # 为每个列组内的行生成连续索引 filtered_data['row_index'] = filtered_data.groupby('col_name').cumcount() # 重塑为目标表格格式 result_df = filtered_data.pivot( index='row_index', columns='col_name', values='texts' ).reset_index(drop=True) # 清除列名的层级标签 result_df.columns.name = None print(result_df)
若需要保留原期望输出中的末尾点号,可在最后追加以下处理:
result_df = result_df.apply(lambda col: col + '.' if col.notna().any() else col)
内容的提问来源于stack exchange,提问作者Vedant Ghavate
相关产品推荐
相关产品推荐

