读取csv文件并根据另一行计算行

时间:2017-03-25 17:05:43

标签: python csv pandas numpy collections

我有一个csv文件,我需要读取不同的列并根据数据集中的另一行将它们的数字相加。
问题是:

  

飞行阶段(例如起飞,巡航,着陆......)的贡献如何   死亡?

我必须为第28列中的每个不同数据总结第23列。

我有一个带掩码和大量IF语句的解决方案:

database = pd.read_csv('Aviation.csv',quotechar='"',skipinitialspace=True, delimiter=',', encoding='latin1').fillna(0)
data = database.as_matrix()

TOcounter = 0

for r in data:
    if r[28] == "TAKEOFF":
        TOcounter += r[23]
print(TOcounter)

此示例显示了我的解决方案的一般概念。我必须在第28列中为每个不同的数据添加大量if语句和计数器。 但我想知道这个问题是否有更明智的解决方案 原始数据位于:https://raw.githubusercontent.com/edipetres/Depressed_Year/master/Dataset_Assignment/AviationDataset.csv

2 个答案:

答案 0 :(得分:0)

这听起来像你想要实现的是

df.groupby('Broad.Phase.of.Flight')['Total.Fatal.Injuries'].sum()

答案 1 :(得分:0)

这是一个快速的解决方案,而不是检查错误,例如是否可以将字符串转换为float。您还应该考虑搜索正确的列(带有文本)而不是依赖于列索引(如23和28)

但这应该有效:

import csv
import urllib2
import collections

url = 'https://raw.githubusercontent.com/edipetres/Depressed_Year/master/Dataset_Assignment/AviationDataset.csv'
response = urllib2.urlopen(url)
df = csv.reader(response)

d = collections.defaultdict(list)
for i,row in enumerate(df):
    key = row[28]
    if key == "" or i == 0 : continue
    val = 0 if(row[23]) ==""  else float(row[23])
    d.setdefault(key,[]).append(val)

d2 = {}
for k, v in d.iteritems(): d2[k] = sum(v)
for k, v in d2.iteritems(): print "{}:{}".format(k,v)

<强>结果:

TAXI:110.0
STANDING:193.0
MANEUVERING:6430.0
DESCENT:1225.0
UNKNOWN:919.0
TAKEOFF:5267.0
LANDING:592.0
OTHER:107.0
CRUISE:6737.0
GO-AROUND:783.0
CLIMB:1906.0
APPROACH:4493.0