我的 csv 中有一个名为“成本”的列,我想根据另一个名为“工厂”的列对其进行求和,以基本上创建按工厂的成本明细。我有如下行,其中每个工厂有多种成本:
Factory,Cost,Cost_Type
Bali,23,0
Sydney,21,1
Sydney,4,2
Denver,8,1
Bali,9,1
我希望能够快速汇总每个工厂的成本,并将这些值保存到变量中。我认为做到这一点的一种方法是循环遍历工厂列表,然后循环遍历 csv。这是我必须要做的:
factories= ['Bali', 'Sydney', 'Denver']
totalcost = 0
balicost = 0
sydneycost = 0
denvercost = 0
for factory in factories:
for row in csv.reader(costcsv):
if row[0] == factory:
我陷入困境的是,我不知道如何更改为不同工厂(balicost、sydneycost 和 denvercost)添加的变量。我刚刚获得成本列总计的简化版本如下:
for row in csv.reader(costcsv):
totalcost += float(row[1])
我对除此之外的不同方法持开放态度(我相信字典可以加入其中),并且欣赏正确方向上的任何观点。
最佳答案
[社区维基,因为它有点离题。]
当您在 Python 中处理表格数据时,您应该考虑 pandas
图书馆。您要执行的操作是 groupby sum,只需两行即可轻松完成:
df = pd.read_csv("factories.csv")
by_factory = df.groupby("Factory")["Cost"].sum()
它会生成一个Series
对象,您可以像字典一样对其进行索引:
>>> by_factory
Factory
Bali 32
Denver 8
Sydney 25
Name: Cost, dtype: int64
>>> by_factory["Bali"]
32
<小时/>
更新,使用更新的数据——如果您还想处理Cost_Type
,您有多种选择。一种是仅选择 Cost_Type == 1 的行:
>>> df[df.Cost_Type == 1]
Factory Cost Cost_Type
1 Sydney 21 1
3 Denver 8 1
4 Bali 9 1
[3 rows x 3 columns]
>>> df[df.Cost_Type == 1].groupby("Factory")["Cost"].sum()
Factory
Bali 9
Denver 8
Sydney 21
Name: Cost, dtype: int64
或者您可以同时在 Factory
和 Cost_Type
上展开 groupby 和 group:
>>> df.groupby(["Cost_Type", "Factory"])["Cost"].sum()
Cost_Type Factory
0 Bali 23
1 Bali 9
Denver 8
Sydney 21
2 Sydney 4
Name: Cost, dtype: int64
关于Python - 来自 csv 的 sumif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22476594/