如何对比DataFrame两列值并提取第三列值,实现指定格式转换?
实现DataFrame的行列转换与值映射需求
我们需要将包含Location、teams、goals三列的原始DataFrame,转换为以Location为唯一主键,每个球队对应“是否存在标记”和“进球数”两列的结构。
原始DataFrame
| Location | teams | goals |
|---|---|---|
| 1 | A | 5 |
| 1 | B | 6 |
| 2 | A | 7 |
| 2 | B | 5 |
| 2 | C | 6 |
| 3 | B | 7 |
期望输出DataFrame
| Location | A Team | A Team goals | B Team | B Team Goals | C Team | C Team goals |
|---|---|---|---|---|---|---|
| 1 | 1 | 5 | 1 | 6 | 0 | NA |
| 2 | 1 | 7 | 1 | 5 | 1 | 6 |
| 3 | 0 | NA | 1 | 7 | 0 | NA |
实现方法(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
相关产品推荐
相关产品推荐

