求特定列的最大频率

2024-05-14 19:31:23 发布

您现在位置:Python中文网/ 问答频道 /正文

输入文件

ID,ROLLNO,AMOUNT,COUNT
1,0700,1500,10
2,900,500,3
3,0700,500,10
4,900,150,9
5,0700,1000,10
6,01620,80,5
7,0700,1000,10
8,0700,1000,10

我必须找到那些ROLLNOAMOUNTCOUNTAMOUNT。例如,对于ROLLNO900AMOUNT150具有大多数COUNT,因此应该在输出中出现。 同样,如果ROLLNO具有相同的COUNT值,则必须对相应的AMOUNT求和以给出结果。例如,对于ROLLNO0700,所有的COUNT都是相同的,所以它的AMOUNT应该是1500+500+1000+1000+1000 = 5000

预期的输出是这样的

ID,ROLLNO,COUNT,AMOUNT
6,900,9,150
5,01620,5,80
2,0700,10,5000

最好的办法是什么?任何帮助都将不胜感激。你知道吗

编辑:我的错。身份证在这里不重要。我只是提出了一些价值观,仅此而已。你知道吗


Tags: 文件id编辑countamount身份证价值观办法
3条回答

下面是一个使用标准库中的collections.defaultdictitertools.groupby的解决方案。你知道吗

如果需要特定的格式,可以使用pandas。你知道吗

from collections import defaultdict
from itertools import groupby
from io import StringIO
import csv

mystr = StringIO("""ID,ROLLNO,AMOUNT,COUNT
1,0700,1500,10
2,900,500,3
3,0700,500,10
4,900,150,9
5,0700,1000,10
6,01620,80,5
7,0700,1000,10
8,0700,1000,10""")

d = defaultdict(int)

with mystr as fin:
    reader = csv.DictReader(fin)
    for line in reader:
        d[(line['ROLLNO'], int(line['COUNT']))] += int(line['AMOUNT'])

sorted_d = sorted(d.items(), reverse=True)
res = [next(j) for _, j in groupby(sorted_d, key=lambda x: x[0][0])]

[(('900', 9), 150),
 (('0700', 10), 5000),
 (('01620', 5), 80)]

如果您想坚持使用纯python,可以使用字典:

file = open("input.txt", "r")
dct = {}
headers = file.readline()
for line in file:
    lst = line.split(",")
    if lst[1] not in dct:
        dct[lst[1]] = lst
        continue
    if dct[lst[1]][3] < lst[3]:
        dct[lst[1]] = lst

print headers
for row in dct.values():
    print ','.join(row)

更新:由于这可能不清楚,将dictionary键设为ROLLNO值将强制执行唯一约束:对于出现的每个ROLLNO值,dictionary dct将在第四列(COUNT)中对值最大的行进行排序

如果pandas是可行的,那么应该这样做:

df = pd.read_csv('yourfilename.csv')
df.groupby(['ROLLNO', 'COUNT'])['AMOUNT'].sum()\
  .reset_index()\
  .sort_values(by=['ROLLNO', 'COUNT'], ascending=False)\
  .drop_duplicates('ROLLNO')
#   ROLLNO  COUNT  AMOUNT
#3    1620      5      80
#2     900      9     150
#0     700     10    5000

请注意,这并不能解决ID的问题,因为您不清楚如何确定它。你知道吗

如果有大量csv文件,可以利用chunksize参数:

chunksize = 10

prefinal = pd.DataFrame()

for chunk in pd.read_csv(filename, chunksize=chunksize):
    grouped = chunk.groupby(['ROLLNO', 'COUNT'])['AMOUNT'].sum()\
                   .reset_index()\
                   .sort_values(by=['ROLLNO', 'COUNT'], ascending=False)\
                   .drop_duplicates('ROLLNO')
    prefinal = pd.concat([prefinal, grouped], ignore_index=True)

final = prefinal.groupby(['ROLLNO', 'COUNT'])['AMOUNT'].sum()\
                .reset_index()\
                .sort_values(by=['ROLLNO', 'COUNT'], ascending=False)\
                .drop_duplicates('ROLLNO')

上面的示例将一次读取文件10行并处理它们,最后处理所有这些行的组合。你知道吗

相关问题 更多 >

    热门问题