2024-04-25 23:15:02 发布
网友
我有一个巨大的CSV文件像这样
代码,持续时间
101、32岁
205、111号
722,33号
205,67岁
205241年
现在我正在读一个文件,因为文件很大。如何计算每个代码的平均持续时间并将其保存到CSV文件?你知道吗
谢谢
对每个数据帧使用groupby.size和groupby.sum,然后将它们减少为结果:
groupby.size
groupby.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'的计数和总和;类似于:
'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,但它工作正常,而且内存效率高。你知道吗
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}
对每个数据帧使用
groupby.size
和groupby.sum
,然后将它们减少为结果:最后一步还可以使用以下代码:
要检查结果:
您可以按代码分组并存储
'Code'
、'Duration'
的计数和总和;类似于:终端输出:
文件输出avg_代码.csv:
不是
pandas
,但它工作正常,而且内存效率高。你知道吗相关问题 更多 >
编程相关推荐