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

如何在循环中为Pandas DataFrame追加生成的列?

循环生成序列并添加为新DataFrame列的问题解决

问题描述

遍历原DataFrame的每一列,通过函数生成与原列长度相同的序列,将这些序列依次作为列添加到新初始化的空DataFrame中,但使用df.assign()时无法正常运行。

错误分析

你的代码存在几个关键问题:

  1. 空DataFrame初始化拼写错误:pd.Dataframe()应为pd.DataFrame()(注意大写F)
  2. assign()用法错误:该方法需要指定列名和对应数据,且会返回新的DataFrame,不会直接修改原对象
  3. 操作对象错误:代码中调用df.assign()而非目标新DataFramedf_new,且未接收返回结果

正确解决方案

方法一:修正循环中的assign()用法

import pandas as pd

# 模拟你的列处理函数,替换为实际业务逻辑
def process_column(col_data):
    return col_data * 0.5  # 示例:生成原列的半值序列

def main():
    # 模拟原DataFrame(替换为你的实际数据)
    df_full = pd.DataFrame({
        'Col1': [48, 118, 87.4, 19.6],
        'Col2': [42, 100, 8, 10],
        'Col3': [40, 122.2, 96, 20],
        'Col4': [49.6, 120.6, 98, 30]
    })
    
    df_new = pd.DataFrame()  # 正确初始化空DataFrame
    for col in df_full.columns:
        col_data = df_full[col]
        value_generated = process_column(col_data)
        
        # 动态指定列名,接收assign返回的新DataFrame
        df_new = df_new.assign(**{col: value_generated})
    
    print(df_new)

方法二:先收集所有列数据,一次性构建(更高效)

循环中频繁修改DataFrame会产生性能开销,推荐先收集所有生成的列数据,再一次性构建新DataFrame:

import pandas as pd

def process_column(col_data):
    return col_data * 0.5

def main():
    df_full = pd.DataFrame({
        'Col1': [48, 118, 87.4, 19.6],
        'Col2': [42, 100, 8, 10],
        'Col3': [40, 122.2, 96, 20],
        'Col4': [49.6, 120.6, 98, 30]
    })
    
    # 用字典存储所有生成的列(键为列名,值为序列)
    new_columns = {}
    for col in df_full.columns:
        new_columns[col] = process_column(df_full[col])
    
    # 一次性构建新DataFrame
    df_new = pd.DataFrame(new_columns)
    print(df_new)

关键注意点

  • pd.DataFrame()初始化时首字母F需大写,拼写错误会直接导致报错
  • assign()是不可变操作,必须接收其返回的新DataFrame才能保留修改
  • 用**{col: value_generated}可以实现动态列名赋值,适配循环中的不同列
  • 当处理大数据集时,方法二的性能远优于方法一,避免了循环中多次DataFrame拷贝

内容的提问来源于stack exchange,提问作者A Newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:50:26