簡體   English   中英

在不使用 PANDA 的情況下打印 CSV 文件中特定列的總和

[英]Print Sum of Particular Columns from a CSV file WITHOUT using PANDA

我有一個名為 PC_Sales.csv 的 CSV 文件,其中包含五個標題,如下所示。 我必須基於這些數據構建一個數據倉庫。

Country       Year         Time_Quarter         Manufacturer      Sales
Brazil        2010             1                    Acer            60
Brazil        2010             1                     HP             70
Brazil        2010             2                    Acer            50
Brazil        2010             2                     HP             50
Brazil        2011             1                    Acer            50
Brazil        2011             1                     HP             40
Brazil        2011             2                    Acer            20
Brazil        2011             2                     HP             30
France        2010             1                    Acer            90
France        2010             1                     HP             20
France        2010             2                    Acer            80
France        2010             2                     HP             50
France        2011             1                    Acer            60
France        2011             1                     HP             30
France        2011             2                    Acer            30
France        2011             2                     HP             40

該程序將要求用戶在 1-3 之間輸入。 如果用戶選擇 input = 1,則 output 將是具有以下銷售額總和的國家/地區: 如果 input = 1,則 output 將是:

Country   Sales
Brazil     370
France     400

如果輸入 = 2,則 output 將是每個國家制造商的銷售總數:

Country         Manufacturer        Sales
Brazil              Acer             180
                     HP              190
France              Acer             260
                     HP              140

如果輸入 = 3,它將打印(兩個國家的)總銷售額以及時間季度和時間年份以及制造商:

Quarter          Year         Manufacturer       Sales
1                2010             Acer            150 (60+90,60=Brazil Q1, 90=France Q1)
1                2010              HP              90
2                2010             Acer            130
2                2010              HP             100
1                2011             Acer            110
1                2011              HP              70
2                2011             Acer             50
2                2011              HP              70

該代碼需要在不使用 Panda 的情況下完成。 如果需要,可以在這種情況下使用 Itertools()!

一種可能的解決方案如下。

在這里,我們為這個任務創建了一個合適的數據結構。 在您的情況下,您必須從csv文件中讀取它。

import re

raw = """Country       Year         Time_Quarter         Manufacturer      Sales
Brazil        2010             1                    Acer            60
Brazil        2010             1                     HP             70
Brazil        2010             2                    Acer            50
Brazil        2010             2                     HP             50
Brazil        2011             1                    Acer            50
Brazil        2011             1                     HP             40
Brazil        2011             2                    Acer            20
Brazil        2011             2                     HP             30
France        2010             1                    Acer            90
France        2010             1                     HP             20
France        2010             2                    Acer            80
France        2010             2                     HP             50
France        2011             1                    Acer            60
France        2011             1                     HP             30
France        2011             2                    Acer            30
France        2011             2                     HP             40
"""

header, *rows = raw.strip().split("\n")

columns = re.sub("\s+", ",", header).split(",")
data = [dict(zip(columns,re.sub("\s+", ",", row).split(","))) for row in rows]

然后可以使用以下代碼段來計算項目 ( input = 1 )

x = "Sales"
to_be_aggregated = ("Country", )
results = {k: 0 for k in set([tuple(itm[tba] for tba in to_be_aggregated) for itm in data])}

for itm in data:
    for key in results.keys():
        if all(itm[tba] == k for tba, k in zip(to_be_aggregated, key)):
            results[key] += int(itm[x])

output 是:

{('France',): 400, ('Brazil',): 370}

使用相同的邏輯,可以在input = 2設置to_be_aggregated = ("Country", "Manufacturer")時對項目進行計數,然后 output 是

{('Brazil', 'HP'): 190,
 ('Brazil', 'Acer'): 180,
 ('France', 'HP'): 140,
 ('France', 'Acer'): 260}

同樣,您可以管理input = 3設置to_be_aggregated = ("Country", "Manufacturer", "Year", "Time_Quarter")

作為完整性檢查,您可以使用pandas執行相同的聚合

import pandas as pd

df = pd.DataFrame(data)
df[x] = df[x].astype(int)

agg = df.groupby(by=list(to_be_aggregated)).sum()

for key, val in results.items():
    assert agg.loc[key].iat[0] == val

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM