如何在动态创建的DataFrame列中追加数据且不覆盖原有内容
解决DataFrame动态列循环追加队列数据的覆盖问题
需要给动态创建的DataFrame新增列,数据来自一个队列列表:
- 当队列长度大于DataFrame行数M时,循环迭代队列元素,按行逗号分隔追加,不能覆盖已有内容
- 当队列长度小于M时,剩余行可以留空或跳过
原代码存在每次循环覆盖整列的问题,期望输出示例如下:
expected output:: Assume m=2 for row 1:: inside new_column a,c,b for row 2:: inside new_column b,a,c m=3 for row 1:: inside new_column a,a for row 2:: inside new_column b,b for row 3:: inside new_column c,c
原代码问题:
def read_tor_cell(self): queue = ['a','b','c','a','b','c'] complete_path = self.Task2 + filename print(complete_path) for i in queue(): # 错误写法:queue是列表,不能加()调用 df_round_robin = self.path_to_csv.head(M) df_round_robin["new_column"] = i # 每次赋值覆盖整列,未实现追加 df_round_robin.to_csv('test.csv') print(df_round_robin)
修正思路
- 只读取一次目标DataFrame,避免重复初始化导致的覆盖
- 为新列初始化空字符串,用于逐行追加元素
- 遍历队列时,通过
元素索引 % M计算目标行,实现轮询分配 - 按行判断是否已有内容,已有则加逗号追加,无则直接赋值
修正后的代码
def read_tor_cell(self): queue = ['a', 'b', 'c', 'a', 'b', 'c'] M = 2 # 可根据实际需求调整行数 complete_path = self.Task2 + filename print(complete_path) # 仅读取一次目标DataFrame,避免重复覆盖 df_round_robin = self.path_to_csv.head(M) # 初始化新列为空字符串 df_round_robin["new_column"] = "" # 遍历队列,按轮询逻辑追加到对应行 for idx, item in enumerate(queue): row_idx = idx % M # 确定当前元素要追加到哪一行 target_row = df_round_robin.at[row_idx, "new_column"] if target_row: df_round_robin.at[row_idx, "new_column"] = f"{target_row},{item}" else: df_round_robin.at[row_idx, "new_column"] = item df_round_robin.to_csv('test.csv') print(df_round_robin)
验证示例结果
当M=2时
队列长度6>2,轮询分配后:
- 第1行:
a,c,b(对应队列第0、2、4位元素) - 第2行:
b,a,c(对应队列第1、3、5位元素)
当M=3时
队列长度6=3×2,轮询分配后:
- 第1行:
a,a(对应队列第0、3位元素) - 第2行:
b,b(对应队列第1、4位元素) - 第3行:
c,c(对应队列第2、5位元素)
当队列长度小于M时(如队列=['a','b'], M=3)
- 第1行:
a - 第2行:
b - 第3行:空字符串(留空)
内容的提问来源于stack exchange,提问作者wawo lala
相关产品推荐
相关产品推荐

