如何将DataFrame指定列转换为breed新列并保留原行数?
问题描述
现有如下结构的DataFrame:
| tweet_id | image_url | doggo | floofer | puppa | puppo |
|---|---|---|---|---|---|
| First | row | none | none | none | none |
| Second | row | doggo | none | none | none |
| third | row | none | floofer | none | none |
| fourth | row | none | none | puppa | none |
| fifth | row | none | none | none | puppo |
需要将doggo、floofer、puppa、puppo这几列的非"none"值提取为新列breed的值,保留原行数,得到目标DataFrame:
| tweet_id | image_url | breed |
|---|---|---|
| First | row | none |
| Second | row | doggo |
| third | row | floofer |
| fourth | row | puppa |
| fifth | row | puppo |
尝试过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
相关产品推荐
相关产品推荐

