如何在Pandas中拆分竖线分隔列以生成多行数据?
解决DataFrame含竖线列拆分多行的问题
首先说你遇到的str.contains('\\|', na=False)的问题:
- 正则转义的小细节:竖线
|是正则表达式里的特殊字符(表示“或”),所以需要转义。你用\\|是可行的(因为Python字符串里双反斜杠代表单个反斜杠),但更简洁不易出错的写法是用原始字符串:r'\|',这样不需要额外处理转义。 - 空值处理的坑:你的
df_wopipe = df[df['director'].str.contains('\\|')==False]会把director列为空值(NaN)的行直接排除掉——因为str.contains对NaN返回NaN,而NaN == False的结果是False,导致这些空值行既不在df_wpipe也不在df_wopipe里。如果要保留空值行,应该改成用取反操作+正确处理空值:
这里df_wpipe = df[df['director'].str.contains(r'\|', na=False)] df_wopipe = df[~df['director'].str.contains(r'\|', na=True)]~表示取反,na=True让空值行被归类到“不含竖线”的分组里。
不过更关键的是:你原来的循环拆分方法效率极低(数据量大时会非常慢),而且最多只能处理100个分隔项,完全没必要这么写。Pandas有专门的方法来处理这种“把列表拆成多行”的需求,一步就能搞定:
方法一:用explode(推荐,Pandas 0.25+可用)
explode是Pandas专门为这种场景设计的函数,直接把列中的列表拆成多行,其他列的值自动重复:
import pandas as pd # 先把director列按竖线拆分成列表(空值会保持为NaN,不会被拆成列表) df['director'] = df['director'].str.split(r'\|') # 拆分列表为多行,ignore_index=True重置索引 df_result = df.explode('director', ignore_index=True)
方法二:兼容旧版Pandas(低于0.25)
如果你的Pandas版本比较老,可以用set_index+stack的组合:
# 假设除了director列,其他列是col1、col3(根据你的实际列名调整) df_result = df.set_index(['col1', 'col3'])['director'] \ .str.split(r'\|', expand=True) \ .stack() \ .reset_index(name='director') \ .drop('level_2', axis=1)
用这两种方法,不仅能正确处理空值和竖线拆分,还比循环写法高效得多,代码也更简洁易读。
内容的提问来源于stack exchange,提问作者Gratous
相关产品推荐
相关产品推荐

