首先按频率对数据进行分组,然后按python

时间:2015-06-02 21:00:20

标签: python csv pandas grouping

我有一个大的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,Counters和循环组合,但我不能在我的生活中超越第一列。

以下是我对顶级呼叫客户进行排序的代码:

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

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

编辑:取出一个包含完全不相关信息的示例文件,并添加了一个新示例。还取出了之前的70行代码,换成了我在提出问题后想出的两个衬垫。

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

2 个答案:

答案 0 :(得分:1)

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())))

答案 1 :(得分:0)

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

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()

但不是我想要的格式,然后它没有按最大数量的来电者排序。