Pandas и Python: сохранение результата .sum () вне цикла for - PullRequest
0 голосов
/ 10 октября 2018

У меня большой массив данных в этой структуре (у меня несколько тысяч столбцов / строк):

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    4
b    5
c    4

Но я не хочу просто печатать значения каждый раз, когда происходит цикл for, я хочу, чтобы они складывались каждый разцикл for (так что в конце я могу добавить их все в .csv только с одной записью для каждого a, b, c и т. д.) Новые значения генерируются каждый раз при выполнении цикла forТаким образом, второй цикл может выдать a 7, b 8, c 10.

Как я уже сказал, я хочу добавить эти значения к чему-то вне цикла for, чтобы каждый раз, когда он проходил снова, добавлялось больше значений.Я пытался использовать enumerate, чтобы вывести каждое значение, чтобы добавить его в словарь, но это не дает мне a, b, c, оно только дает значения.

Не важно, как это делается, но мне нужен способ: 1) автоматически сгенерировать все имена столбцов (a, b, c и т. Д.), 2) связать их с их числом,с суммой, увеличивающейся каждый раз при выполнении цикла for, 3) сохраните их в .csv после завершения цикла for.

Я попытался использовать sumtest.to_csv('sumtest.csv', mode='a') в конце каждого цикла for, но это дает мнефайл со значениями, повторяемыми вместо добавленных:

a    4
b    5
c    4
a    7
b    8
c    10
...  ...

Вместо этого конечный вывод должен выглядеть следующим образом (запятые не нужны, я просто думаю о .csv):

a, 11
b, 13
c, 14

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

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")
0 голосов
/ 10 октября 2018

Итак, у вас есть цикл, который вызывает различные части фрейма данных и выдает sumtest каждый раз, когда он выполняется?

Если это так, в каждом цикле вы можете создать диктат из суммы,затем используйте 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 трудно определить, но это работает само по себе и модифицируется вg, как я описал, заставит его работать внутри любого цикла for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...