为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

aluckdog 2021-07-02 14:01:18
我在这个结构中有一个大数据框(我的有几千列/行):testdf = pd.DataFrame({ 'a': [0, 2, 2],                        'b': [2, 1, 2],                        'c': [0, 2, 2]})我正在对.sum()for 循环中使用的所有值求和:sumtest = testdf.sum()我希望能够将这些值添加到 for 循环之外的内容中。每次循环发生时,都应该将值添加到循环外的某些东西(字典?)。最终目标是在 for 循环完成后导出所有添加的值。当我print(sumtest),我得到:a    4b    5c    4但我不想在每次 for 循环发生时只打印值,我希望每次 for 循环运行时将它们加在一起(这样最后我可以将它们全部添加到 .csv 中,只有一个条目each a, b,c等)每次 for 循环运行时都会生成新值,因此第二个循环可以生成a 7, b 8, c 10。正如我所说,我想将这些值添加到 for 循环之外的内容中,因此每次它再次通过时都会添加更多值。我尝试使用enumerate获取每个值以将其添加到字典中,但这并没有给我我的a, b, c,它只给出了值。它是如何完成的并不重要,但我需要一种方法来 1) 自动生成所有列名 ( a, b, c, 等),2) 将它们与它们的编号相关联,每次 for 循环运行时总和都会增加,3) 保存这些for 循环完成后转换为 .csv。我尝试sumtest.to_csv('sumtest.csv', mode='a')在每个 for 循环的末尾使用,但它给了我一个重复而不是添加值的文件:a    4b    5c    4a    7b    8c    10...  ...相反,最终输出应该是这样的(不需要逗号,我只是在考虑 .csv):a, 11b, 13c, 14
查看完整描述

2 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

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")


查看完整回答
反对 回复 2021-07-13
?
PIPIONE

TA贡献1829条经验 获得超9个赞

那么,您有一个循环调用数据帧的各个部分并在sumtest每次运行时生成?


如果是这样,在每个循环中,您可以从 sumtest 中创建一个 dict,然后在该 dict 上使用 Counter,然后将其添加到循环外部定义的 dict,循环不断添加到该 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})

我正在做的事情和你要做的事情之间的区别在于,在你正在运行的任何循环中(作为一个函数,我假设?),你将整个字典输入作为变量函数,然后在循环中添加两个计数器,然后让函数返回这两个字典的总和作为新的整体字典。


如果对 for 循环的语言没有更多的了解,就很难指定,但这本身就有效,并且按照我的描述修改它将使它在任何 for 循环中工作。


查看完整回答
反对 回复 2021-07-13
  • 2 回答
  • 0 关注
  • 331 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信