Python - 来自 csv 的 sumif

标签 python csv for-loop data-analysis

我的 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

或者您可以同时在 FactoryCost_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/

相关文章:

python - 扩展数据框中的每一行

python - 是否可以将 C 库与 python AppEngine 一起使用?

ruby - quote_char 导致适合 ruby​​ CSV 导入

java - 从 Java 生成的 CSV 文件添加了不需要的问号 (?)

javascript - 回收for循环?

python - 在循环中使用多个模型时,tensorflow 或 python 是否存在内存清理问题?

python - 按 'escape' 时离开 kivy 应用程序

python - 将带有年日列的 CSV 数据作为日期时间读入 Pandas

php - 使用插入 PDO 检索值

c - 实现无限循环时,使用 while(1) vs for(;;) vs goto(在 C 中)有区别吗?