我有一个包含32个列标题的大型CSV文件。我想总结每一列,结果是每个列标题的32个单独的总结。我可以访问python和powershell。任何帮助将不胜感激。
我得到的最远的是这个网站:pandas groupby with sum() on large csv file?
答案 0 :(得分:0)
您可以在pandas中使用read_csv
来读取文件,然后在数据框上使用sum()
。
import pandas as pd
filename = r'folder/file.txt'
df = pd.read_csv(filename)
total = df.sum()
答案 1 :(得分:0)
在此示例数据文件中仅使用内置函数的简单方法:
#! /usr/bin/env python
from __future__ import print_function
sep = ';'
with open('32_numeric_columns.csv', 'rt') as f:
columns = f.readline().strip().split(sep)
rows = [0] * len(columns)
for line in f.readlines():
data = line.strip().split(sep)
for i, cell in enumerate(data, start=0):
rows[i] += float(cell)
print(columns)
print(rows)
在此数据文件中:
a0;a1;a2;a3;a4;a5;a6;a7;a8;a9;b0;b1;b2;b3;b4;b5;b6;b7;b8;b9;c0;c1;c2;c3;c4;c5;c6;c7;c8;c9;d0;d1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1
的产率:
['a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'd0', 'd1']
[10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0]
处理一个包含1280000000字节数据的大文件。在我的机器上生产5分钟:
$> time ./so_csv_adder.py
['a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'd0', 'd1']
[20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0, 20000000.0]
real 4m47.374s
user 4m43.748s
sys 0m2.545s
答案 2 :(得分:0)
import pandas as pd
pd.read_csv(r'my_path_to_file/my_file.csv', sep=';').sum().values
熊猫绝对是最佳选择。这两行代码将打印出列的总和。如果你在Windows上使用' \'用于指定路径。我假设你的csv文件使用分号作为分隔符(如果它的逗号使用sep =','如果它的选项卡使用sep =' \ t')
如果要将结果写入文件,请使用:
import pandas as pd
df = pd.read_csv(r'my_path_to_file/my_file.csv', sep=';').sum()
df.to_csv(r'my_path_to_file/my_file_sum.csv')
答案 3 :(得分:0)
import csv
with open('yourBigFile.csv', 'rb') as f:
spreadsheet=csv.reader(f) #you may need some options
#depending on the format of the file
header=None
for row in spreadsheet:
if header is None:
header=row
mySums=[0]*len(row) # initialize to zero
continue
else:
# this will only work if every cell has a number
# this will be faster, so use it if it is possible
# in your application
#mySums=[mySums[x]+float(row[x]) for x in range(len(mySums))]
# more generally
for i,x in enumerate(row):
try:
converted=float(x)
except ValueError: #you may actually want an error
#raised. YMMV depending on your data
converted=0
mySums[i]+=converted
由于我不确定您希望如何格式化输出,我会留给您。
答案 4 :(得分:0)
在powershell(或Linux / Mac OS等)中,您应该能够安装出色的CSVFIX命令行软件包(在大型CSV文件上运行非常快,并且还具有Windows安装程序)。
您可以使用CSVFIX summary
命令生成每一列的总和:
csvfix summary -sum 1:32 filename.csv
这将为您提供每列总和的单行摘要:
"43", "21", "425", "1092", [...]
如果文件有标题行,请不要忘记也添加-ifn
标志以忽略第一行。