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

如何提取DataFrame各列有效值并合并为单行结果表?

问题描述

现有DataFrame(表A),其中Position X与Name X为配对列,每个Name列仅有一个有效值(对应Position值不为-1的加粗值)。需要提取这些有效值合并为表B,仅填充有效Name值。尝试用SQL GROUP BY但过滤后无结果,求解决方法。

当前表A:

Position AName APosition BName BPosition CName CPosition DName DPosition EName E
-1tortise-1monkey2coca cola-1slug-1rooster
3sprite2coffee-1bird-1monkey-1ostrich
-1nope-1nope-1fish5root beer1tea
-1nope-1nope-1nope-1nope-1nope

目标表B:

Name AName BName CName DName E
spritecoffeecoca colaroot beertea

解决方法

一、Pandas处理方案

针对每个Position-Name配对列筛选有效值,再组合成目标DataFrame。

代码实现

import pandas as pd

# 假设原始DataFrame为df
column_pairs = [
    ("Position A", "Name A"),
    ("Position B", "Name B"),
    ("Position C", "Name C"),
    ("Position D", "Name D"),
    ("Position E", "Name E")
]

# 提取各Name列的有效值
result = {}
for pos_col, name_col in column_pairs:
    # 筛选Position不等于-1的行,取对应Name值(仅一个有效值,直接取第一行)
    valid_name = df[df[pos_col] != -1][name_col].iloc[0]
    result[name_col] = [valid_name]

# 生成目标DataFrame
df_b = pd.DataFrame(result)

关键说明

  • 遍历每一组配对列,通过布尔索引筛选有效行
  • 利用iloc[0]获取唯一的有效值,最后将所有有效值整合成一行的DataFrame

二、SQL处理方案

之前GROUP BY无结果是因为错误地过滤了行,正确思路是对每个Name列聚合出对应Position≠-1的值。

实现SQL语句

SELECT
    MAX(CASE WHEN "Position A" != -1 THEN "Name A" END) AS "Name A",
    MAX(CASE WHEN "Position B" != -1 THEN "Name B" END) AS "Name B",
    MAX(CASE WHEN "Position C" != -1 THEN "Name C" END) AS "Name C",
    MAX(CASE WHEN "Position D" != -1 THEN "Name D" END) AS "Name D",
    MAX(CASE WHEN "Position E" != -1 THEN "Name E" END) AS "Name E"
FROM table_a;

关键说明

  • 用CASE WHEN定位每个Name列的有效行值,无效行返回NULL
  • 用MAX聚合时会自动忽略NULL,保留唯一的有效值
  • 无需GROUP BY,因为目标是将所有行的有效信息合并为单行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 07:27:39