[英]how to append a column from a csv file to another csv file without using panda?
[英]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.