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

如何对比DataFrame两列值并提取第三列值,实现指定格式转换?

实现DataFrame的行列转换与值映射需求

我们需要将包含Location、teams、goals三列的原始DataFrame,转换为以Location为唯一主键,每个球队对应“是否存在标记”和“进球数”两列的结构。

原始DataFrame

Locationteamsgoals
1A5
1B6
2A7
2B5
2C6
3B7

期望输出DataFrame

LocationA TeamA Team goalsB TeamB Team GoalsC TeamC Team goals
115160NA
2171516
30NA170NA

实现方法(Python Pandas)

步骤1:导入依赖并构造原始数据

import pandas as pd
import numpy as np

# 构造原始DataFrame
df = pd.DataFrame({
    'Location': [1,1,2,2,2,3],
    'teams': ['A','B','A','B','C','B'],
    'goals': [5,6,7,5,6,7]
})

步骤2:添加球队存在标记

给每条记录添加值为1的exists列,用于后续标记球队是否存在于对应Location:

df['exists'] = 1

步骤3:透视生成存在标记表和进球数表

分别对exists和goals列做透视,按Location分组,teams作为列:

# 生成存在标记表,缺失值填充为0并转为整数
exists_pivot = df.pivot(index='Location', columns='teams', values='exists').fillna(0).astype(int)
# 生成进球数表,缺失值保留为NaN(对应输出的NA)
goals_pivot = df.pivot(index='Location', columns='teams', values='goals')

步骤4:重命名列并合并表

将两个透视表的列名调整为需求格式,然后横向合并:

# 重命名存在标记列
exists_pivot.columns = [f"{col} Team" for col in exists_pivot.columns]
# 重命名进球数列(注意B队的列名是"Goals"大写)
goals_pivot.columns = [
    f"{col} Team goals" if col != 'B' else f"{col} Team Goals" 
    for col in goals_pivot.columns
]

# 合并两个表
result_df = pd.concat([exists_pivot, goals_pivot], axis=1)

步骤5:调整列顺序

按照期望输出的列顺序重新排列:

# 定义目标列顺序
desired_columns = [
    'Location', 'A Team', 'A Team goals',
    'B Team', 'B Team Goals', 'C Team', 'C Team goals'
]
# 重置索引并调整列顺序
result_df = result_df.reset_index()[desired_columns]

运行上述代码后,result_df即为符合要求的输出DataFrame。如果需要将pandas默认的NaN转为字符串格式的NA,可添加一行:

result_df = result_df.replace(np.nan, 'NA')

内容的提问来源于stack exchange,提问作者Vivek kanna Jayaprakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:10:39