熊猫和Python:将.sum()的结果保存在for循环之外

时间:2018-10-10 19:55:20

标签: python pandas dataframe

在这种结构中,我有一个大型数据框(我的数据库有数千列/行):

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中,每个abc等都有一个条目。)每次for循环运行时都会生成新值,因此第二个循环可以生成a 7,{{ 1}},b 8

正如我所说,我想将这些值添加到for循环之外的内容中,因此每次通过时,都会添加更多的值。我尝试使用c 10取出每个值以将其添加到字典中,但这并没有给我我的enumerateab,而是仅给了价值观。

完成操作并不重要,但是我需要一种方法来1)自动生成所有列名(cab等),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
...  ...

2 个答案:

答案 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循环中使用。