首先按频率分组数据,然后按 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()
但不是我想要的格式,而且也不是按来电人数最多的排序。
我有一个很大的 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()
但不是我想要的格式,而且也不是按来电人数最多的排序。