Python программа, которая извлекает наиболее часто встречающиеся имена из файла .csv - PullRequest
0 голосов
/ 28 февраля 2020

Я создал программу, которая генерирует 5000 случайных имен, ssn, city, address и email и хранит их в файле fakeprofile.csv. Я пытаюсь извлечь наиболее распространенные имена из файла. Я смог заставить программу работать синтаксически, но не смог извлечь частые имена. Вот код:

import re
import statistics
file_open = open('fakeprofile.csv').read()
frequent_names = re.findall('[A-Z][a-z]*', file_open)
print(frequent_names)

Пример в файле:

Alicia Walters 419-52-4141 Yorkstad 66616 Schultz Extensions Suite 225
Reynoldsmouth, VA 72465 stevenserin@stein.biz
Nicole Duffy 212-38-9009 West Timothy 51077 Phillips Ports Apt. 314
Hubbardville, IN 06723 kaitlinthomas@bennett-carter.com
Stephanie Lewis 442-20-1279 Jacquelineshire 650 Gutierrez Forge Apt. 839
West Christianbury, TN 13654 ukelley@gmail.com
Michael Harris 108-81-3733 East Toddberg 14387 Douglas Mission Suite 038
Garciaview, WI 58624 kshields@yahoo.com
Aaron Moreno 171-30-7715 Port Taraburgh 56672 Wagner Path
Lake Christopher, VA 37884 lucasscott@nguyen.info
Alicia Zimmerman 286-88-9507 Barberstad 5365 Heath Extensions Apt. 731
South Randyburgh, NJ 79367 daniellewebb@yahoo.com
Brittney Mcmillan 334-44-0321 Lisahaven PSC 3856, Box 2428
APO AE 03215 kevin95@hotmail.com
Amanda Perkins 327-31-6610 Perryville 8750 Hurst Harbor Apt. 929

Пример вывода:

', 'Lake', 'Brianna', 'P', 'A', 'Michael', 'Smith', 'Harveymouth', 'Patricia', 'Tunnel', 'West', 'William', 'G', 'A', 'Charles', 'Perkins', 'Lake', 'Marie', 'Lisa', 'Overpass', 'Suite', 'Kennedymouth', 'C', 'A', 'Barbara', 'Perez', 'Billyshire', 'Joshua', 'Village', 'Cindymouth', 'W', 'I', 'Curtis', 'Simmons', 'North', 'Mitchellport', 'Gordon', 'Crest', 'Suite', 'Jacksonburgh', 'C', 'O', 'Cameron', 'Berg', 'South', 'Dean', 'Christina', 'Coves', 'Williamton', 'T', 'N', 'Maria', 'Williams', 'North', 'Judith', 'Carson', 'Overpass', 'Apt', 'West', 'Amandastad', 'N', 'M', 'Hannah', 'Dennis', 'Rodriguezmouth', 'P', 'S', 'C', 'Box', 'A', 'P', 'O', 'A', 'E', 'Laura', 'Richardson', 'Lake', 'Kayla', 'Johnson', 'Place', 'Suite', 'Port', 'Jennifermouth', 'N', 'H', 'John', 'Lawson', 'Hintonhaven', 'Thomas', 'Via', 'Mossport', 'N', 'J', 'Jennifer', 'Hill', 'East', 'Phillip', 'P', 'S', 'C', 'Box', 'A', 'P', 'O', 'A', 'E', 'Cody', 'Jackson', 'Lake', 'Jessicamouth', 'Snyder', 'Ways', 'Apt', 'New', 'Stacey', 'M', 'E', 'Ryan', 'Friedman', 'Shahburgh', 'Jerry', 'Pike', 'Suite', 'Toddfort', 'N', 'V', 'Kathleen', 'Fox', 'Ferrellmouth', 'P', 'S', 'C', 'Box', 'A', 'P', 'O', 'A', 'P', 'Michael', 'Thompson', 'Port', 'Jessica', 'Boone', 'Spurs', 'Suite', 'Port', 'Ashleyland', 'C', 'O', 'Christopher', 'Marsh', 'North', 'Catherine', 'Scott', 'Trail', 'Apt', 'Baileyburgh', 'F', 'L', 'Richard', 'Rangel', 'New', 'Anna', 'Ray', 'Drive', 'Apt', 'Nunezland', 'I', 'A', 'Connor', 'Stanton', 'Troyshire', 'Rodgers', 'Hill', 'West', 'Annmouth', 'N', 'H', 'James', 'Medina',

Моя проблема не в состоянии извлечь большинство часто находит имена, а также избегает этих заглавных букв. Вместо этого я извлек все имена (включая ненужные заглавные буквы), и приведенное выше изображение представляет собой небольшую выборку всех извлеченных имен. Я заметил, что первые имена всегда находятся в нечетных строках выходных данных, и я пытаюсь захватить наиболее частые имена в этих нечетных строках.

Файл fakeprofile.csv был создан этой программой:

import csv
import faker
from faker import Faker
fake = Faker()
name = fake.name(); print(name)
ssn = fake.ssn(); print(ssn)
city = fake.city(); print(city)
address = fake.address(); print(address)
email = fake.email(); print(email)
profile = fake.simple_profile()
for i,j in profile.items():
    print('{}: {}'.format(i,j))
print('Name: {}, SSN: {}, City: {}, Address: {}, Email: {}'.format(name,ssn,city,address,email))
with open('fakeprofile.csv', 'w') as f:
    for i in range(0,5001):
        print(f'{fake.name()} {fake.ssn()} {fake.city()} {fake.address()} {fake.email()}', file=f)

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Достигает ли это того, чего вы хотите?

import collections, re

# Read in all lines into a list
with open('fakeprofile.csv') as f:
    lines = f.readlines()
# Throw out every other line
lines = [line for i, line in enumerate(lines) if i%2 == 0]
# Keep only first word of each line
names = [line.split()[0] for line in lines]
# Find most common names
n = 3
frequent_names = collections.Counter(names).most_common(n)
# Display most common names
for name, count in frequent_names:
    print(name, count)

Для подсчета используется collections.Counter вместе с методом most_common().

0 голосов
/ 28 февраля 2020

Итак, основная проблема, с которой вы столкнулись, заключается в том, что вы используете регулярное выражение, которое захватывает каждую букву. Вас интересует первый мир в нечетной строке.

вы можете сделать что-нибудь по этим строкам:

# either use a dict to count or a list to transform as counter.
dico_count = {}
with open('fakeprofile.csv') as file_open:  # use of context manager

    line_number = 1
    for line in file_open: #iterates all the lines

        if line_number % 2 != 0 : # odd line

            spt = line.strip().split()
            dico_count[spt[0]] = dico_count.get(spt[0], 0) + 1

frequent_name_counter = [(k,v) for k,v in sorted(dico_count.items(), key=lambda x: x[1], reverse=True)]
0 голосов
/ 28 февраля 2020

Я думаю, было бы лучше, если бы вы использовали библиотеку pandas для манипуляции с CSV (сбор информации о желаниях), а затем применили к ней коллекцию python, например, counter (df ['name']), или иначе не могли бы вы дать нам больше информации о файле CSV.

спасибо

...