迭代计算数据帧的平均值

2024-04-25 23:15:02 发布

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

我有一个巨大的CSV文件像这样

代码,持续时间

101、32岁

205、111号

722,33号

205,67岁

722,33号

205241年

现在我正在读一个文件,因为文件很大。如何计算每个代码的平均持续时间并将其保存到CSV文件?你知道吗

谢谢


Tags: 文件csv代码持续时间
3条回答

对每个数据帧使用groupby.sizegroupby.sum,然后将它们减少为结果:

import numpy as np
import pandas as pd

c = np.random.randint(100, 10000, 100000)
d = np.random.rand(100000)

df = pd.DataFrame({"c":c, "d":d})
r1 = df.groupby("c").d.mean()

counts = []
sums = []
for i in range(10):
    df2 = df[i*10000:(i+1)*10000]
    g = df2.groupby("c").d
    counts.append(g.size())
    sums.append(g.sum())

from functools import partial
func = partial(pd.Series.add, fill_value=0)
r2 = reduce(func,  sums) / reduce(func, counts).astype(float)

最后一步还可以使用以下代码:

r3 = pd.concat(sums, axis=1).sum(axis=1) / pd.concat(counts, axis=1).sum(axis=1).astype(float)

要检查结果:

print np.allclose(r1, r2)
print np.allclose(r1, r3)

您可以按代码分组并存储'Code''Duration'的计数和总和;类似于:

import pandas as pd

def f(g):
    return pd.DataFrame({'count': [g.shape[0]], 'sum': [g['Duration'].sum()]})

reader = pd.read_csv('data.csv',chunksize=2)
acc = pd.DataFrame({})
for chunk in reader:
    acc = acc.add(chunk.groupby('Code').apply(f).reset_index(level=1,drop=True),fill_value=0)

acc['avg'] = acc['sum']/acc['count']
print acc

acc.to_csv('avg_codes.csv',cols=['avg'],index_label='Code')

终端输出:

      count  sum         avg
Code                        
101       1   32   32.000000
205       3  419  139.666667
722       2   66   33.000000

文件输出avg_代码.csv

Code,avg
101,32.0
205,139.66666666666666
722,33.0

不是pandas,但它工作正常,而且内存效率高。你知道吗

import csv
from collections defaultdict

code_counts = defaultdict(int)
code_durations = defaultdict(int)
with open('yourfile.csv', 'rb') as f:
    reader = csv.reader(f)
    next(reader) # discard header row
    for code, duration in reader:
        code_counts[code] += 1
        code_durations[code] += int(duration)    
code_averages = {code: code_duratons[code] / float(code_counts[code]) for code in code_counts}

相关问题 更多 >