如何提取DataFrame各列有效值并合并为单行结果表?
问题描述
现有DataFrame(表A),其中Position X与Name X为配对列,每个Name列仅有一个有效值(对应Position值不为-1的加粗值)。需要提取这些有效值合并为表B,仅填充有效Name值。尝试用SQL GROUP BY但过滤后无结果,求解决方法。
当前表A:
| Position A | Name A | Position B | Name B | Position C | Name C | Position D | Name D | Position E | Name E |
|---|---|---|---|---|---|---|---|---|---|
| -1 | tortise | -1 | monkey | 2 | coca cola | -1 | slug | -1 | rooster |
| 3 | sprite | 2 | coffee | -1 | bird | -1 | monkey | -1 | ostrich |
| -1 | nope | -1 | nope | -1 | fish | 5 | root beer | 1 | tea |
| -1 | nope | -1 | nope | -1 | nope | -1 | nope | -1 | nope |
目标表B:
| Name A | Name B | Name C | Name D | Name E |
|---|---|---|---|---|
| sprite | coffee | coca cola | root beer | tea |
解决方法
一、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
相关产品推荐
相关产品推荐

