[英]How group by sum and average column in python?
作為輸入,我有一個帶時間的CSV文件,每次都有一串數字。
Time,F1,F2,F3
8:11,5,2,4
9:25,9,8,2
9:39,7,3,2
9:53,6,5,1
10:07,4,6,7
10:21,7,3,1
10:35,5,6,7
11:49,1,2,1
12:03,3,3,1
我想輸出按小時平均和總和分組的每小時表格:
Time,SUM F1,SUM F2,SUM F3,AVG F1,AVG F2,AVG F3
8:00,5,2,4,5,2,4
9:00,22,16,5,7.3,5.3,1.6
10:00,16,15,15,5.3,5,5
11:00,1,2,1,1,2,1
12:00,3,3,1,3,3,1
到目前為止,我一直在看用字典來完成它,其中小時是一個關鍵,值是一個計數和總和的列表,然后將總和除以計數就可以得到平均值。 我敢肯定,必須有一種更清潔的方法來做到這一點。 也許有些圖書館可以使用它。 有什么建議么?
大熊貓解決方案:
import pandas as pd
df = pd.read_csv('f123.csv')
df['Time'] = df['Time'].apply(lambda x: x.split(':')[0] + ':00')
by_hour = df.groupby('Time')
data = {}
for name in ['F1', 'F2', 'F3']:
data['SUM ' + name] = by_hour[name].sum()
data['AVG ' + name] = by_hour[name].mean()
res = pd.DataFrame(data)
print(res)
印刷品:
AVG F1 AVG F2 AVG F3 SUM F1 SUM F2 SUM F3
Time
10:00 5.333333 5.000000 5.000000 16 15 15
11:00 1.000000 2.000000 1.000000 1 2 1
12:00 3.000000 3.000000 1.000000 3 3 1
8:00 5.000000 2.000000 4.000000 5 2 4
9:00 7.333333 5.333333 1.666667 22 16 5
另存為csv文件:
res.to_csv('res.csv')
這是res.csv
的內容:
Time,AVG F1,AVG F2,AVG F3,SUM F1,SUM F2,SUM F3
10:00,5.333333333333333,5.0,5.0,16,15,15
11:00,1.0,2.0,1.0,1,2,1
12:00,3.0,3.0,1.0,3,3,1
8:00,5.0,2.0,4.0,5,2,4
9:00,7.333333333333333,5.333333333333333,1.6666666666666667,22,16,5
以下內容將幫助您入門,它使用Python的csv
模塊處理文件,並使用itertools.groupby
將條目按小時分組:
import csv
from itertools import groupby, chain
with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output:
csv_input = csv.reader(f_input)
csv_output = csv.writer(f_output)
header = next(csv_input)
csv_output.writerow(["Time","SUM F1","SUM F2","SUM F3","AVG F1","AVG F2","AVG F3"])
for k, g in groupby(csv_input, lambda x: int(x[0].split(':')[0])):
entries = [(int(f1), int(f2), int(f3)) for t, f1, f2, f3 in g]
sums = [(sum(x), sum(x)/float(len(entries))) for x in zip(*entries)]
row = ['{}:00'.format(k)] + list(chain.from_iterable(zip(*sums)))
csv_output.writerow(row)
這將為您提供一個輸出csv文件,如下所示:
Time,SUM F1,SUM F2,SUM F3,AVG F1,AVG F2,AVG F3
8:00,5,2,4,5.0,2.0,4.0
9:00,22,16,5,7.333333333333333,5.333333333333333,1.6666666666666667
10:00,16,15,15,5.333333333333333,5.0,5.0
11:00,1,2,1,1.0,2.0,1.0
12:00,3,3,1,3.0,3.0,1.0
zip
用於轉置列條目。
使用Python 2.7.9測試
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.