Skip to main content
 首页 » 编程设计

Python:如何最好地解析 csv 并仅计算一个子集的值

2025年05月04日18kevingrace

我有一个 CSV 文件,其中包含 3 列和 11 行的以下内容,第一行是标题。我自己创建了这个文件,以便从中学习一个简单的文件。每个订单项都是一份水果订单。

OrderNo      Fruit     Origin 
1           Apple        NY 
2           Orange       FL       
3           Banana       CA 
4           Pear         NJ 
5           Grapes       VA 
6           Grapes       VA 
7           Grapes       MD 
8           Grapes       MA 
9           Pineapple    HI 
10          Grapes       GA 

我正在尝试用 Python 解析这些数据,以执行以下操作:

(1) 确定为每种水果生成最多订单的州,以及 (2) 确定每种水果来自任何单个州的最高订单数,(3) 按字母顺序输出此结果,如下所示:

Apple NY 1 
Banana CA 1 
Grapes VA 2 
Orange FL 1 
Pear NJ 1 
Pineapple HI 1 

在用 csv.reader 读取 csv 文件后,我试图用 Counter 和 for 循环完成计数:

import csv 
from collections import Counter  
 
cnt = Counter() 
f = open("/test.csv") 
reader = csv.reader(f, delimiter=",") 
header = next(f)  
 
for row in reader:    
    cnt[row[2]] += 1  

但是有没有更好的办法呢?

请您参考如下方法:

我实际上会使用 pandas,它是列表/字典/电子表格/数据库的组合。它专为以这种方式处理数据而设计。

import pandas as pd 
from collections import defaultdict 
 
path_to_file = "/test.csv" 
df = pd.read_csv(path_to_file) 
 
groups = df.groupby(['Fruit', 'Origin']) 
max_for_fruit = defaultdict(int) #first pass through the groups, store the maximum for each fruit to handle ties 
 
for g in groups: 
    fruit, count = g[0][0], len(g[1]) 
    max_for_fruit[ fruit ] = max( max_for_fruit[fruit], count ) 
 
for g in groups: 
    fruit, state, count = g[0][0], g[0][1], len(g[1]) 
    if count == max_for_fruit[ fruit ]: 
        print( "{} {} {}".format(fruit, state, count ) ) 

这是输出。

Apple NY 1 
Banana CA 1 
Grapes VA 2 
Orange FL 1 
Pear NJ 1 
Pineapple HI 1 

http://pandas.pydata.org/pandas-docs/stable/groupby.html

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

http://pandas.pydata.org/pandas-docs/stable/tutorials.html