如何在不覆盖列值的情况下连接数据帧

2024-09-26 22:10:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在for循环中创建一个数据帧列表,然后将它们连接到for循环之外并写入excel。我已经使代码接近,但是由于某种原因,在for循环中创建的列最终成为最终值,而不是循环通过时的每个单独值。我相信这是非常简单的,我只是错过了一些简单的事情,但今晚似乎无法解决。下面是一些虚拟代码来说明和帮助解决问题。最后,我想要一个带有wks 1-9的excel输出。但是,在我的实际输出中,wk列中的所有值都等于9

import pandas as pd
sample = []
area = pd.Series({'California':423967, 'Texas':695662})
pop = pd.Series({'California':38332521, 'Texas':26448193})

data = pd.DataFrame({'area':area, 'pop':pop})
print(data)

for i in range(10):
    data['wk'] = i
    sample.append(data)
    print(data)

res = pd.concat(sample)
res.to_excel("Concatenating DataFrames.xlsx", index=False)

Tags: 数据sample代码fordataresareaexcel
2条回答

在一个循环中生成多个数据帧并将它们连接起来是非常低效的。最好在列表或字典上进行迭代,然后在循环后创建一个数据帧。下面,我已将您的系列文章转换回字典。请注意,在循环的每次迭代中都必须复制字典,以便循环不会不断改变原始字典

import pandas as pd
import openpyxl
from copy import deepcopy

area = pd.Series({'California':423967, 'Texas':695662})
pop = pd.Series({'California':38332521, 'Texas':26448193})
area_d = area.to_dict()
pop_d = pop.to_dict()

sample = []
for i in range(10):
    area_copy = deepcopy(area_d)
    pop_copy = deepcopy(pop_d)
    area_copy['wk'] = i
    pop_copy['wk'] = i
    sample += [area_copy, pop_copy]
df = pd.DataFrame(sample)
df.to_excel("result.xlsx", index = False)

这里的问题在于,当您将数据附加到列表中时,它不会为它创建单独的内存,而是它们都引用相同的内存,这就是为什么在循环中最后一次更新后,它会变成9或最终值

替换

sample.append(data)

sample.append(data.copy())

.copy()将为循环中的每个df创建新内存

相关问题 更多 >

    热门问题