如何生成以字母-列对为列的新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
相关产品推荐
相关产品推荐

