2017-07-10 19 views
2

我想用python编写这个脚本。 我有一堆信用卡交易的数据集。这包括日期,账号,金额(无论是购买或信用卡/退票) 数据看起来像这样count/rank在python中的基于发生的列表

Acct Number --- Amount 
4445 --- $20 
4445 --- $30 
4445 --- $30 
7555 --- $50 
7555 --- $50 
7555 --- $60 

首先,我想与量相结合的账号,这样的事情

4445 | 20 
4445 | 30 
4445 | 30 

7555 | 50 
7555 | 50 
7555 | 60 

然后,我会根据它们的出现数来计算整个列表中的每个元组。例如:

4445 | 20 | 1 
4445 | 30 | 1 
4445 | 30 | 2 

7555 | 50 | 1 
7555 | 50 | 2 
7555 | 60 | 1 

正如你所看到的,元组(4445 | 20)只出现一次,我要计为1 元组(4445 | 30)出现了两次,所以我要算第一元组为1,第二个为2.

同样,元组(7555 | 50)出现两次,第一次出现会计为1,接下来是2, 和(7555 | 60)只显示一次,所以我计为1.

我在尝试几种方法,但它并没有给我我想要的。 非常感谢您的帮助。

谢谢。

回答

1

下使用itertools.groupby,这需要输入进行排序,并enumerate这给了我们项目的索引中的迭代。我们将每行视为一个字符串,然后将计数附加在它后面。

L = [["4445 | 20","4445 | 30","4445 | 30"], 
    ["7555 | 50","7555 | 50","7555 | 60"]] 

from itertools import groupby 

R = [[ r + ' | ' + str(i+1) 
    for h,g in groupby(A) 
    for i,r in enumerate(g)] for A in L] 

for A in R: 
    for r in A: 
     print r 
    print 

这导致:

4445 | 20 | 1 
4445 | 30 | 1 
4445 | 30 | 2 

7555 | 50 | 1 
7555 | 50 | 2 
7555 | 60 | 1 
0

您应该使用嵌套字典,其中的密钥是account,而密钥是另一个字典,amount的值为,表现形式为值。

from collections import defaultdict 
data_dict = defaultdict(dict) 
with open(file,r): 
    for line in file: 
    acc.amount = line.split(',')#assuming the data is split based on a comma 
    data_dict[acc][amount] = data_dict[acc].get(amount,0)+1 
#print it like so 
for key in data_dict: 
    for am in data_dict[key]: 
    print(key,data_dict[key],data_dict[key][am]) 
+0

这是怎么用有写这个东西。现在'collections'模块中有'defaultdict'和'Counter',它们可以大大简化事情(例如,在更新其值之前不需要测试密钥的存在性)。 – PaulMcG

+0

@PaulMcG即将与他们编辑我的答案,谢谢! – PYA

+0

@PaulMcG请在我的编辑中建议任何改进:) – PYA

1
from collections import Counter 

lines = list() 

with open("data.text", 'r', encoding="utf-8") as data: 
    for line in data[1:]: 
     lines.append(line.split(" --- $")) 

ct = Counter(lines) 

for item in ct: 

    print(' | '.join([*item, str(ct[item])]))  
相关问题