Подсчет количества раз, когда определенная позиция отображается в списке - PullRequest
0 голосов
/ 19 апреля 2020

Итак, у меня есть список «клиентов», которые мне нужно подсчитать, сколько раз в каждой строке появляется этот «элемент». небольшой фрагмент текстового файла внутри .zip FakeCostomers :

1,female,Melissa,J,Palmer,4 Lynch Street,Milwaukee,WI,53213,US,Melissa.J.Palmer@gmail.com,920-959-8247,9/29/1972,Visa,281.84,5

2,male,Edwin,M,Corder,4302 Pick Street,RIDGEWAY,CO,81432,US,Edwin.M.Corder@outlook.com,970-626-1897,2/28/1953,Visa,277.58,16

3,female,Laura,A,Olvera,365 Tori Lane,Salt Lake City,UT,84116,US,Laura.A.Olvera@yahoo.com,801-599-5964,4/11/1963,MasterCard,560.63,24

4,male,Wayne,D,Adams,3643 Nash Street,Chicago,IL,60605,US,Wayne.D.Adams@yahoo.com,312-948-6927,7/16/1957,Visa,320.11,3

5,female,Mari,R,Smith,3024 Atha Drive,Palmdale,CA,93550,US,Mari.R.Smith@gmail.com,661-574-4919,7/30/1973,MasterCard,798.58,28

6,male,Craig,H,Salazar,3929 Goosetown Drive,Hendersonville,NC,28792,US,Craig.H.Salazar@gmail.com,828-697-6697,1/15/1959,Visa,183.35,29

7,male,Henry,S,Clark,205 Charla Lane,Mesquite,TX,75150,US,Henry.S.Clark@gmail.com,972-686-5507,8/28/1962,Visa,650.58,27

8,male,Jerry,L,Littleton,1652 My Drive,Elmsford,NY,10523,US,Jerry.L.Littleton@gmail.com,347-219-4091,9/5/1975,MasterCard,525.73,8

9,female,Georgia,V,Allen,1226 Jefferson Street,Norfolk,VA,23510,US,Georgia.V.Allen@yahoo.com,757-774-4490,5/17/1952,Visa,910.39,6

10,male,Ted,A,Harding,2143 Lake Floyd Circle,HOCKESSIN,DE,19707,US,Ted.A.Harding@gmail.com,302-239-3674,7/12/1958,MasterCard,307.51,25

11,male,Jose,J,Houston,2639 Olive Street,Shelby,OH,44875,US,Jose.J.Houston@gmail.com,419-342-5793,4/23/1943,Visa,447.97,27

Например, если я хочу узнать, сколько женщин в этом списке.

До сих пор я пробовал:

def getColumnDistribution(filename,columnNum):

    file = open(filename,"r")
    listoflists = []

    for line in file:

        stripped_line = line.strip()

        line_list = stripped_line.split()

        listoflists.append(line_list)

        NUMBER = line_list.count(line_list[columnNum])

он продолжает выдавать "list index out of range" Кто-нибудь знает, как я могу это исправить или использовать лучший метод?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Python дает вам множество инструментов, которые делают подобные задачи безболезненными. Например, вы можете передать вопросы синтаксического анализа csv в модуль csv и счетчик в collections.Counter. Тогда это всего лишь пара строк:

import csv
from collections import Counter

with open(path, 'r') as f:
    reader = csv.reader(f)
    headers = next(reader)    # pop off the header row

    genderCounts = Counter(row[1] for row in reader)

print(genderCounts['female'])
# 15167

print(genderCounts['male'])
# 14833

Если вы используете Dictreader из csv, вы можете индексировать по имени столбца, что делает код более читабельным:

with open(path, 'r') as f:
    reader = csv.DictReader(f)

    genderCounts = Counter(row['Gender'] for row in reader)

Конечно, если вы много работаете с такими данными, pandas существенно облегчит вам жизнь:

import pandas as pd

df = pd.read_csv(path)
df['Gender'].value_counts()

# female    15167
# male      14833
# Name: Gender, dtype: int64
0 голосов
/ 19 апреля 2020

Это будет работать для вас. Проверено на 3,6 В

import csv

def openFile(file_name:str)->tuple:
    with open(file_name,'r') as csv_file:
        csv_reader = csv.reader(csv_file)
        return tuple(csv_reader)  

def getColumnDistribution(csv_data:tuple,name_to_count:str)->int:

    num_of_count = [idx for idx,rows in enumerate(csv_data) if name_to_count in rows]
    print("number of occurence:",num_of_count)
    return len(num_of_count)

#driver code
csv_data = openFile(your_csv_file_name)
getColumnDistribution(csv_data,'female')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...