在这种结构中,我有一个大型数据框(我的数据库有数千列/行):
testdf = pd.DataFrame({ 'a': [0, 2, 2],
'b': [2, 1, 2],
'c': [0, 2, 2]})
我正在for循环中使用.sum()
对所有值求和:
sumtest = testdf.sum()
我希望能够将这些值添加到for循环外。每次发生循环时,都应将值添加到循环外部的某个内容(字典?)上。最终目标是在for循环完成后导出所有添加的值。
当我print(sumtest)
时,我得到:
a 4
b 5
c 4
但是我不想在每次for循环发生时只打印这些值,我希望每次for循环运行时将它们加在一起(以便最后我可以将它们全部添加到.csv中,每个a
,b
,c
等都有一个条目。)每次for循环运行时都会生成新值,因此第二个循环可以生成a 7
,{{ 1}},b 8
。
正如我所说,我想将这些值添加到for循环之外的内容中,因此每次通过时,都会添加更多的值。我尝试使用c 10
取出每个值以将其添加到字典中,但这并没有给我我的enumerate
,a
,b
,而是仅给了价值观。
完成操作并不重要,但是我需要一种方法来1)自动生成所有列名(c
,a
,b
等),2)将它们与它们的数量,每次for循环运行时总和都增加,3)一旦for循环完成,将其保存到.csv中。
我尝试在每个for循环的末尾使用c
,但是它给了我一个文件,该文件具有重复的值而不是添加的值:
sumtest.to_csv('sumtest.csv', mode='a')
相反,最终输出应为(不需要逗号,我只是在考虑.csv):
a 4
b 5
c 4
a 7
b 8
c 10
... ...
答案 0 :(得分:1)
IIUC,您只能add()
每个sum(axis=0)
到正在运行的主数据帧:
import numpy as np
import pandas as pd
np.random.seed(42)
# starting empty dataframe
master = pd.DataFrame(np.zeros((1, 3)), columns=['a', 'b', 'c'])
n = 10
for _ in range(n):
# initialize new data for a, b, c on each loop
df = pd.DataFrame(np.random.randint(0, 5, size=(3, 3)), columns=['a','b','c'])
# compute column sums, add to master
master = master.add(df.sum(axis=0))
# transpose to get column names as row indices, per OP specs
master.T
0
a 52.0
b 67.0
c 74.0
master.T.to_csv("output.csv")
答案 1 :(得分:0)
那么,您有一个循环调用数据帧的各个部分并在每次运行时产生sumtest
吗?
如果是这样,则可以在每个循环中从总和中创建一个dict,然后在该dict上使用Counter,然后将其添加到在循环外部定义的循环中不断添加的dict。
如果我只是将您的数据框复制到第二个字典中,然后将它们加在一起,这就是它在您上面发布的内容中的工作方式:
import pandas as pd
from collections import Counter
testdf = pd.DataFrame({ 'a': [0, 2, 2],
'b': [2, 1, 2],
'c': [0, 2, 2]})
sumtest = testdf.sum()
sumtest2 = testdf.sum()
st = Counter(dict(sumtest))
st2 = Counter(dict(sumtest2))
stc = st + st2
print(stc)
输出:
Counter({'b': 10, 'a': 8, 'c': 8})
我正在做的事情和要做的事情之间的区别是,在您正在运行的任何循环内(作为函数,我假设是?),您会将整体字典输入为变量添加到函数中,然后将两个Counter添加到循环中,然后让该函数返回这两个字典的和作为新的整体字典。
虽然对for循环的语言没有更多的了解,但是很难指定,但是它本身可以工作,并且按照我的描述进行修改将使其可以在任何for循环中使用。