在数据框中添加一列,如果列X不为空则取其值,否则取列Y的值

-1 投票
1 回答
45 浏览
提问于 2025-04-14 17:01

我有一个数据表,其中有一列数据是用分隔符 "\" 分开的。每一行可能有1个或2个分隔符,具体情况不一样。

df[['Desc1','Desc2','Desc3']] = df['Descr'].str.split("\\", expand=True)

我已经把这一列拆分成了多列,像这样:

现在在 df['Desc3'] 这一列中,有些行有值,而在 df['Desc1'] 中也有些行有值。我想添加一个新列,这个新列会优先取 Desc3 列的值,如果 Desc3 没有值,就取 Desc1 列的值。

我尝试了以下代码:

def fn_name(row):
    if row['Desc3'] == '':
        return row['Desc1']
    else:
        return row['Desc3']

df['name'] = df.apply(fn_name,axis=1)

但是,这段代码没有成功。当 row['Desc3'] 有值时,它能返回 df['name'] 列的值,但当 row['Desc3'] 没有值时,它却不能返回 row['Desc1'] 的值。

  1. 我该怎么修复这个问题?
  2. 有没有比使用 apply 函数更好的方法来实现这个?

1 个回答

0

我觉得''(空字符串)会是个问题。''和null(空值)是不一样的。

你需要用null来检查条件,而不是用''。

会有两种解决方案。

# using apply
def fn_name(row):
    if pd.notnull(row['Desc3']):
        return row['Desc1']
    else:
        return row['Desc3']

df['name'] = df.apply(fn_name, axis = 1)


# using np.where
df['name'] = np.where(pd.notnull(df['Desc3']), df['Desc3'], df['Desc1'])

撰写回答