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

如何生成以字母-列对为列的新Pandas DataFrame,每行对应原DF

生成目录型Pandas DataFrame问题

原始DataFrame定义

import pandas as pd

object_1df = pd.DataFrame(
    [['a', 1], ['b', 2]],
    columns=['letter', 'number'])
object_2df = pd.DataFrame(
    [['b', 3, 'cat'], ['c', 4, 'dog']],
    columns=['letter', 'number', 'animal'])

输出分别为:

letter  number
0      a       1
1      b       2

  letter  number animal
0      b       3    cat
1      c       4    dog

需求说明

需要生成一个目录型DataFrame:

  • 每行对应一个原始DataFrame
  • 列是所有字母_列名的组合,最终列顺序为:
    a_letter  a_number b_letter  b_number b_animal c_letter  c_number c_animal
    

尝试的代码及错误结果

尝试的代码:

objects = [object_1df, object_2df]

catalog = pd.DataFrame()
for objectdf in objects:
    object_row = pd.DataFrame()
    for letter in objectdf['letter']:
        for column in objectdf.columns:
            object_row[f'{letter}_{column}'] = objectdf[column].loc[
                objectdf['letter'] == letter]
    catalog = pd.concat([catalog, object_row], ignore_index=True)
display(catalog)

得到的错误结果:

a_letter  a_number b_letter  b_number b_animal c_letter  c_number c_animal
0        a       1.0      NaN       NaN      NaN      NaN       NaN      NaN
1      NaN       NaN        b       3.0      cat      NaN       NaN      NaN

问题:每个原始DataFrame只保留了部分行数据,且每个字母单独占一行,不符合“每行对应一个原DataFrame”的需求。

正确实现方式

错误原因分析

原代码中,每次遍历letter时,给object_row赋值的是单个字母对应的行数据(Series类型),这会导致每个字母生成一行,而非将同一个原始DataFrame的所有字母数据合并到同一行。

解决方案代码

import pandas as pd

# 定义原始DataFrame
object_1df = pd.DataFrame(
    [['a', 1], ['b', 2]],
    columns=['letter', 'number'])
object_2df = pd.DataFrame(
    [['b', 3, 'cat'], ['c', 4, 'dog']],
    columns=['letter', 'number', 'animal'])

# 1. 收集所有可能的目标列名(确保最终DataFrame包含全部列)
all_columns = []
for df in [object_1df, object_2df]:
    for _, row in df.iterrows():
        letter = row['letter']
        for col in df.columns:
            col_name = f"{letter}_{col}"
            if col_name not in all_columns:
                all_columns.append(col_name)
# 按字母排序列名,匹配需求中的顺序
all_columns.sort()

# 2. 生成目录型DataFrame
objects = [object_1df, object_2df]
catalog = pd.DataFrame(columns=all_columns)

for df in objects:
    row_data = {}
    # 遍历当前DataFrame的每一行,构造列名-值的映射
    for _, row in df.iterrows():
        letter = row['letter']
        for col in df.columns:
            col_name = f"{letter}_{col}"
            row_data[col_name] = row[col]
    # 将映射转为单行DataFrame,合并到目录中
    catalog = pd.concat([catalog, pd.DataFrame([row_data])], ignore_index=True)

print(catalog)

输出结果

a_letter  a_number b_letter  b_number b_animal c_letter  c_number c_animal
0        a         1        b         2      NaN      NaN       NaN      NaN
1      NaN       NaN        b         3      cat        c         4      dog

这个结果完全符合需求:每行对应一个原始DataFrame,所有目标列都存在,对应的数据正确填充,不存在的字段显示为NaN。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:25:14