我有一个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
答案 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