首先按频率分组数据,然后按 python 中的类别分组

Grouping Data first by frequency, then by category in python

我有一个很大的 csv 文件,它是来电者数据的日志。

我的文件示例:

CompanyName    High Priority     QualityIssue
Customer1         Yes             User
Customer1         Yes             User
Customer2         No              User
Customer3         No              Equipment
Customer1         No              Neither
Customer3         No              User
Customer3         Yes             User
Customer3         Yes             Equipment
Customer4         No              User

我的代码目前可以对数据进行排序,因此我可以获得排名靠前的来电者。

但是,我接下来需要的是为该呼叫者查找他们的呼叫类型的计数。然后像下面这样格式化一个 csv:

Top Calling Customers,         Equipment,    User,    Neither,
Customer 3,                      2,           2,        0,
Customer 1,                      0,           2,        1,
Customer 2,                      0,           1,        0,
Customer 4,                      0,           1,        0,

我已经尝试了 groupby、计数器和循环的各种组合,但我终究无法通过第一列。

这是我必须对顶级来电客户进行排序的代码:

 data = pandas.read_csv('Copy of HEAT Data.csv', delimiter =',')
 TopCustomerCallers = data['CompanyName'].value_counts()

但是,原来的问题仍然存在,我现在必须使用 TopCustomerCallers 来计算 QualityIssue 并对其进行排序。希望这个问题有道理。

edit: 取出一个示例文件,其中包含完全不相关的信息并添加了一个新示例。还把之前的70行代码去掉,换成了我问完问题后想出来的两行

编辑:更多示例数据。实际数据超过 5000 行并进入 AA 列,但我只对客户的频率及其呼叫类型感兴趣。

from collections import defaultdict, OrderedDict

counts = defaultdict(lambda: {"User": 0, "Equipment": 0, "Neither": 0})
with open('filename.tsv', 'rb') as fh: 
    reader = csv.reader(fh, delimiter='\t') # assuming it's formatted like your example above
    for row in reader: 
        company, calltype = row[0], row[2]
        counts[company][calltype] += 1

在这一点上,你有这样的东西:

In [14]: dict(counts)
Out[14]:
{'Customer1': {'Equipment': 0, 'Neither': 1, 'User': 2},
 'Customer2': {'Equipment': 0, 'Neither': 0, 'User': 1},
 'Customer3': {'Equipment': 2, 'Neither': 0, 'User': 2},
 'Customer4': {'Equipment': 0, 'Neither': 0, 'User': 1}}

根据您希望此输出的结构,它可能就像调用 csv.DictWriter 一样简单,或者您可能希望利用 collections.OrderedDict 在写入项目之前对其进行排序。

编辑:例如,要将这个 defaultdict 变成一个 OrderedDict,您可以这样做:

sorted_counts = OrderedDict(sorted(counts.iteritems(), key=lambda counts_tup: sum(counts_tup[1].values())))

我可以使用以下方法对数据进行排序:

import csv
import pandas
from collections import Counter
from collections import defaultdict, Counter

data = pandas.read_csv(filename.csv', delimiter =',')
byqualityissue = data.groupby(["CompanyName","QualityIssue"]).size()

但不是我想要的格式,而且也不是按来电人数最多的排序。