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

如何将DataFrame指定列转换为breed新列并保留原行数?

问题描述

现有如下结构的DataFrame:

tweet_idimage_urldoggoflooferpuppapuppo
Firstrownonenonenonenone
Secondrowdoggononenonenone
thirdrownonefloofernonenone
fourthrownonenonepuppanone
fifthrownonenonenonepuppo

需要将doggo、floofer、puppa、puppo这几列的非"none"值提取为新列breed的值,保留原行数,得到目标DataFrame:

tweet_idimage_urlbreed
Firstrownone
Secondrowdoggo
thirdrowfloofer
fourthrowpuppa
fifthrowpuppo

尝试过pd.melt()但未得到预期结果,求可行解法。

解决方法

方法1:替换空值后按行求和

利用每行仅存在一个非"none"值(或全为none)的特点,先将"none"替换为空字符串,按行求和后再把空值转回"none":

import pandas as pd

# 构造示例数据
data = {
    'tweet_id': ['First', 'Second', 'third', 'fourth', 'fifth'],
    'image_url': ['row']*5,
    'doggo': ['none', 'doggo', 'none', 'none', 'none'],
    'floofer': ['none', 'none', 'floofer', 'none', 'none'],
    'puppa': ['none', 'none', 'none', 'puppa', 'none'],
    'puppo': ['none', 'none', 'none', 'none', 'puppo']
}
df = pd.DataFrame(data)

# 处理逻辑
breed_cols = ['doggo', 'floofer', 'puppa', 'puppo']
df['breed'] = df[breed_cols].replace('none', '').sum(axis=1)
df['breed'] = df['breed'].replace('', 'none')

# 保留目标列
result = df[['tweet_id', 'image_url', 'breed']]
print(result)

方法2:空值掩码+向后填充

将"none"替换为NaN,按行向后填充后取最后一列的值,再把NaN转回"none":

import pandas as pd

# 构造示例数据(同上)
data = {
    'tweet_id': ['First', 'Second', 'third', 'fourth', 'fifth'],
    'image_url': ['row']*5,
    'doggo': ['none', 'doggo', 'none', 'none', 'none'],
    'floofer': ['none', 'none', 'floofer', 'none', 'none'],
    'puppa': ['none', 'none', 'none', 'puppa', 'none'],
    'puppo': ['none', 'none', 'none', 'none', 'puppo']
}
df = pd.DataFrame(data)

# 处理逻辑
breed_cols = ['doggo', 'floofer', 'puppa', 'puppo']
df['breed'] = df[breed_cols].mask(df[breed_cols] == 'none').bfill(axis=1).iloc[:, -1]
df['breed'] = df['breed'].fillna('none')

# 保留目标列
result = df[['tweet_id', 'image_url', 'breed']]
print(result)

方法3:逐行筛选非空值

通过apply遍历每行,筛选出非"none"的值,无匹配则返回"none":

import pandas as pd

# 构造示例数据(同上)
data = {
    'tweet_id': ['First', 'Second', 'third', 'fourth', 'fifth'],
    'image_url': ['row']*5,
    'doggo': ['none', 'doggo', 'none', 'none', 'none'],
    'floofer': ['none', 'none', 'floofer', 'none', 'none'],
    'puppa': ['none', 'none', 'none', 'puppa', 'none'],
    'puppo': ['none', 'none', 'none', 'none', 'puppo']
}
df = pd.DataFrame(data)

# 处理逻辑
breed_cols = ['doggo', 'floofer', 'puppa', 'puppo']
def get_breed(row):
    non_none = row[row != 'none']
    return non_none.iloc[0] if len(non_none) > 0 else 'none'

df['breed'] = df[breed_cols].apply(get_breed, axis=1)

# 保留目标列
result = df[['tweet_id', 'image_url', 'breed']]
print(result)

内容的提问来源于stack exchange,提问作者Yusuf Abdulganiyu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:54:17