基于列名条件创建Pandas DataFrame:处理重复列行复制需求
Pandas处理重复列转重复行的实现方案
需求背景
作为Python新手,我需要合并多个包含_duplicate后缀重复列的DataFrame,目标是将这些重复列转换为重复行,而非保留列结构。指定的唯一列名列表为:List_of_columns = ["a", "b", "c", "d", "id"]
示例数据
DataFrame 1 (X)
| a | b | a_duplicate | b_duplicate | c | id |
|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | id1 |
DataFrame 2 (Y)
| a | c | a_duplicate | c_duplicate | d | id |
|---|---|---|---|---|---|
| 6 | 7 | 8 | 9 | 10 | id2 |
期望输出
| a | b | c | d | id |
|---|---|---|---|---|
| 1 | 2 | 5 | Null | id1 |
| 3 | 4 | 5 | Null | id1 |
| 6 | Null | 7 | 10 | id2 |
| 8 | Null | 9 | 10 | id2 |
注:原期望输出中第四行的
c值为7,应为笔误,按逻辑应取c_duplicate的9,代码实现将按正确逻辑生成结果
代码实现
import pandas as pd def process_duplicate_cols(df, base_cols): processed_rows = [] # 遍历每一行,生成原始行和重复行 for _, row in df.iterrows(): # 生成原始行:取非重复列的值,不存在的列设为缺失值 original_row = {col: row[col] if col in df.columns else pd.NA for col in base_cols} processed_rows.append(original_row) # 生成重复行:优先取_duplicate列的值,无对应_duplicate列的保留原始值 duplicate_row = {} for col in base_cols: dup_col = f"{col}_duplicate" if dup_col in df.columns: duplicate_row[col] = row[dup_col] else: duplicate_row[col] = row[col] if col in df.columns else pd.NA processed_rows.append(duplicate_row) return pd.DataFrame(processed_rows) # 创建示例DataFrame X = pd.DataFrame({ "a": [1], "b": [2], "a_duplicate": [3], "b_duplicate": [4], "c": [5], "id": ["id1"] }) Y = pd.DataFrame({ "a": [6], "c": [7], "a_duplicate": [8], "c_duplicate": [9], "d": [10], "id": ["id2"] }) List_of_columns = ["a", "b", "c", "d", "id"] # 处理每个DataFrame并合并 processed_X = process_duplicate_cols(X, List_of_columns) processed_Y = process_duplicate_cols(Y, List_of_columns) final_df = pd.concat([processed_X, processed_Y], ignore_index=True) print(final_df)
代码说明
process_duplicate_cols函数:- 遍历输入DataFrame的每一行,先生成基于原始列的行
- 再生成基于
_duplicate列的重复行,无对应重复列的字段保留原始行的值 - 将所有生成的行转为DataFrame返回
- 合并处理结果:用
pd.concat将多个处理后的DataFrame合并为最终结果
运行结果
a b c d id 0 1 2 5 <NA> id1 1 3 4 5 <NA> id1 2 6 <NA> 7 10 id2 3 8 <NA> 9 10 id2
内容的提问来源于stack exchange,提问作者MK2121
相关产品推荐
相关产品推荐

