You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Pandas中基于条件对部分行的列拆分后赋值的实现问题

在Pandas中基于条件对部分行的列拆分后赋值的实现问题

嘿,我看你正在尝试用Pandas实现一个需求:只对满足特定条件的行,把某一列按分隔符拆分后赋值给另外两列对吧?我之前也踩过类似的小坑,来给你捋捋问题和解决办法~

先看你写的代码:

df = pd.DataFrame({"a":["z|v", "b|3", "z|x", "dfe|5", "xs|2"]})
df['x']=""
df['y']=""
mask = df['a'].str.startswith('z')
print(mask)
df.loc[mask, ['x', 'y']] = df.loc[mask, 'a'].str.split('|', n=1, expand=True)
print(df)

你运行之后应该发现,原本期望赋值给x、y列的地方出现了NaN,而不是拆分后的内容对吧?这其实是因为你初始把x、y列设成了空字符串类型,而str.split拆分出来的是object类型的DataFrame,直接赋值的时候类型不匹配,导致赋值失败,就出现了NaN。

那怎么解决呢?给你两种实用的办法:

  • 办法一:先正确初始化列类型再赋值
import pandas as pd

df = pd.DataFrame({"a":["z|v", "b|3", "z|x", "dfe|5", "xs|2"]})
# 先创建空的x、y列,指定类型为object,避免类型不匹配
df['x'] = pd.Series(dtype='object')
df['y'] = pd.Series(dtype='object')

mask = df['a'].str.startswith('z')
# 拆分满足条件的行得到临时DataFrame
split_df = df.loc[mask, 'a'].str.split('|', n=1, expand=True)
# 赋值给对应的列
df.loc[mask, ['x', 'y']] = split_df

# 如果希望不满足条件的行x、y显示空字符串,而不是NaN,就加这一步
df[['x', 'y']] = df[['x', 'y']].fillna('')

print(df)

运行后输出就是你想要的效果:

a  x  y
0    z|v  z  v
1    b|3     
2    z|x  z  x
3  dfe|5     
4    xs|2     
  • 办法二:用where函数一步到位(更简洁)
    不用提前初始化列,直接拆分后结合where函数,只给满足条件的行赋值,不满足的自动设为空字符串:
import pandas as pd

df = pd.DataFrame({"a":["z|v", "b|3", "z|x", "dfe|5", "xs|2"]})
mask = df['a'].str.startswith('z')
# 拆分后直接通过where过滤赋值
df[['x', 'y']] = df['a'].str.split('|', n=1, expand=True).where(mask, '')

print(df)

这种写法代码更短,逻辑也清晰,一步就能完成所有操作。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 13:19:33