Итерируйте по каждой строке и увеличивайте количество терминов, связанных с конкретным исследователем в CSV-файле - PullRequest
0 голосов
/ 15 мая 2018

Я читаю CSV-файл на Python, в котором много названий болезней в одном столбце и связанных исследователей в другом. Файл выглядит примерно так -

[Table 1]
Terms                    Researcher
1.Asthma                 Dr. Roberts
2.Brochial cancer        Dr. Lee
3.HIV                    Dr.Roberts
4.HIV                    Dr. Lee
5.Influenzae             Dr. Wang
6.Bronchial Cancer       Dr. Wang
7.Influenzae             Dr. Roberts
8.dengue                 prof. christopher
9.Arthritis              prof. swaminathan
10.Arthritis             prof. christopher
11.Asthma                Dr. Roberts
12.HIV                   Dr. Lee
13.Bronchial Cancer      Dr. Wang
14.dengue                prof. christopher
15.HIV                   prof. christopher
16.HIV                   Dr. Lee

Я хочу, чтобы мой код перебирал каждую строку и увеличивал счетчик частоты термина, связанного с каждым исследователем, чтобы, когда пользователь вводит, какой термин он / она ищет, он должен получить следующую таблицу вывода -

Term you are looking for : HIV
Names of the researchers                Frequency
Dr. Roberts                             1
Dr. Lee                                 3
prof. christopher                       1

Теперь давайте посмотрим, что я делаю -

In[1]:
import pandas as pd
import numpy as np
data = pd.read_csv("Researchers Title Terms.csv")
data.head()

, который дает мне [Таблица 1] а потом я делаю это -

In[2]:
term = input("Enter the term you are looking for:")
term = term.lower()
list_of_terms = []
for row in data: 
    if row[data.Terms] == term
        researcher1 += 1

    elif data.Terms == term
        researcher2 += 1

    elif data.Terms == term
        researcher3 += 1

    else
        print("Sorry!", term, "not found in the database!")
print("Term you are looking for : ", term)
print("Dr. Roberts:", researcher1)
print("Dr. Lee:", researcher2)
print("prof. christopher:", researcher3)

Все, что я здесь получаю -

File "<ipython-input-9-b85d0d187059>", line 5
if row[data.Terms] == term
                          ^
SyntaxError: invalid syntax

Я новичок в программировании на Python, поэтому не совсем уверен, что моя логика полностью неверна или здесь действительно есть какая-то синтаксическая ошибка. Любая помощь будет оценена. После того, как я попробовал несколько вещей и ничего не получил, я ставлю это на сообщество. Заранее спасибо!

Ответы [ 5 ]

0 голосов
/ 15 мая 2018

groupby и value_counts

Простой и интуитивно понятный

df.Terms = df.Terms.str.replace('\d+\.\s*', '').str.upper()
df.Researcher = df.Researcher.str.title()
s = df.groupby('Terms').Researcher.value_counts()

s

Terms             Researcher       
ARTHRITIS         Prof. Christopher    1
                  Prof. Swaminathan    1
ASTHMA            Dr. Roberts          2
BROCHIAL CANCER   Dr. Lee              1
BRONCHIAL CANCER  Dr. Wang             2
DENGUE            Prof. Christopher    2
HIV               Dr. Lee              3
                  Dr.Roberts           1
                  Prof. Christopher    1
INFLUENZAE        Dr. Roberts          1
                  Dr. Wang             1
Name: Researcher, dtype: int64

Вы можете получить доступ к различным условиям с loc или xs

s.loc['HIV']

Researcher
Dr. Lee              3
Dr.Roberts           1
Prof. Christopher    1
Name: Researcher, dtype: int64

Или

s.xs('HIV')

Researcher
Dr. Lee              3
Dr.Roberts           1
Prof. Christopher    1
Name: Researcher, dtype: int64

pd.factorize и np.bincount

import re

pat = re.compile('\d+\.\s*')
f, u = pd.factorize(list(zip(
    (re.sub(pat, '', x).upper() for x in df.Terms),
    df.Researcher.str.title()
)))

s = pd.Series(dict(zip(u, np.bincount(f))))

И вы можете получить доступ так же, как указано выше.

0 голосов
/ 15 мая 2018

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

term_of_interest = 'HIV'

(df.groupby('Researcher')
 .apply(lambda x: x.Terms.str.contains(term_of_interest)
        .sum())
 .rename('Frequency').to_frame())

                   Frequency
Researcher                  
Dr. Lee                    3
Dr. Roberts                0
Dr. Wang                   0
Dr.Roberts                 1
prof. christopher          1
prof. swaminathan          0
0 голосов
/ 15 мая 2018

В Python, при создании цикла if, elif, for и т. Д. Правильный синтаксис - двоеточие в конце строки инициализации. Поэтому в вашем коде вам нужно обновить его до следующего:

    for row in data: 
        if row[data.Terms] == term:
            researcher1 += 1

        elif data.Terms == term:
            researcher2 += 1

        elif data.Terms == term:
            researcher3 += 1

        else:
            print("Sorry!", term, "not found in the database!")

Кроме того, как только вы исправите это, основываясь на вашем коде, похоже, у вас также будет ошибка. Вы устанавливаете пользовательский ввод в нижний регистр, но вы не делаете то же самое с данными, считанными из файла CSV. Таким образом, ни один из терминов не будет равен пользовательскому вводу.

0 голосов
/ 15 мая 2018

читать данные в панд.примите ввод и затем filter, groupby & size даст желаемый результат

term = input("Enter the term you are looking for:")

data[data.Term.str.lower() == term.lower()].groupby('Researcher').size()
# Output with term = 'HIV'
Dr. Lee              3
Dr.Roberts           1
prof. christopher    1
dtype: int64

. В этом методе исследователи, не связанные с термином (то есть имеющие размер == 0), не отображаются.

Чтобы показать исследователям, у которых нет терминов, с нулевым счетом, сначала настройте информационный фрейм исследователей, а внешнее объедините с ним результирующий информационный фрейм.

researchers = pd.DataFrame({'Researcher': data.Researcher.unique()})
out = data[data.Term.str.lower() == term.lower()].groupby('Researcher').agg({'Terms': 'size'})
pd.merge(reserachers, out, how='outer').fillna(0).sort_values('Terms', ascending=False)
# outputs:
          Researcher  Terms
1            Dr. Lee    3.0
2         Dr.Roberts    1.0
4  prof. christopher    1.0
0        Dr. Roberts    0.0
3           Dr. Wang    0.0
5  prof. swaminathan    0.0
0 голосов
/ 15 мая 2018
from collections import Counter
from pprint import pprint

if __name__ == '__main__':
    docs = ["Dr.Roberts",
            "Dr.Lee",
            "Dr.Roberts",
            "Dr.Lee",
            "Dr.Wang",
            "Dr.Wang",
            "Dr.Roberts",
            "prof.christopher",
            "prof.swaminathan",
            "prof.christopher",
            "Dr.Roberts",
            "Dr.Lee",
            "Dr.Wang",
            "prof.christopher",
            "prof.christopher",
            "Dr.Lee"]
    pprint(Counter(docs).most_common(5))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...