在Pandas DataFrame中按分隔符拆分多列并转为行
解决Pandas同时拆分并展开多列的问题
我来帮你搞定这个需求!你想要把pos和value这两个用斜杠分隔的列按位置对应拆分展开,让每一组对应的值都成为单独的行。之前的方法失效,大概率是因为拆分后没保证两列元素的一一对应,或者索引处理出现了偏差。下面给你两种可靠的解决方案:
方法一:使用Pandas 1.3.0+的多列explode(推荐)
如果你的Pandas版本在1.3.0及以上,可以直接同时对两个列执行explode操作,这是最简洁高效的方式:
import pandas as pd # 构造原始DataFrame data = { 'id': [1, 2], 'pos': ['a/b/c', 'd/a'], 'value': ['test/test2/test3', 'test/test5'], 'sent': [21, 21] } df = pd.DataFrame(data) # 先将pos和value列拆分为列表 df['pos'] = df['pos'].str.split('/') df['value'] = df['value'].str.split('/') # 同时爆炸两个列,确保对应位置的元素匹配 df_exploded = df.explode(['pos', 'value']).reset_index(drop=True) print(df_exploded)
运行后你会得到想要的结果:
id pos value sent 0 1 a test 21 1 1 b test2 21 2 1 c test3 21 3 2 d test 21 4 2 a test5 21
方法二:兼容低版本Pandas的自定义行展开
如果你的Pandas版本低于1.3.0,不支持多列explode,可以通过自定义函数逐行处理:
import pandas as pd data = { 'id': [1, 2], 'pos': ['a/b/c', 'd/a'], 'value': ['test/test2/test3', 'test/test5'], 'sent': [21, 21] } df = pd.DataFrame(data) # 定义函数,将单行拆分为多行 def expand_row(row): pos_items = row['pos'].split('/') value_items = row['value'].split('/') # 确保两个列表长度一致(根据你的数据,这里应该是匹配的) return pd.DataFrame({ 'id': [row['id']] * len(pos_items), 'pos': pos_items, 'value': value_items, 'sent': [row['sent']] * len(pos_items) }) # 对每一行应用函数,然后合并结果 df_exploded = pd.concat([expand_row(row) for _, row in df.iterrows()], ignore_index=True) print(df_exploded)
这个方法会逐行拆分并生成小DataFrame,最后合并成最终结果,同样能达到你的要求。
内容的提问来源于stack exchange,提问作者Mi.
相关产品推荐
相关产品推荐

