классификация и подсчет уникальных элементов с учетом различных условий столбца

#python #group-by #classification #unique #counter

#python #группировка по #классификация #уникальный #счетчик

Вопрос:

Привет, я использую python для классификации некоторых данных:

 Articles                                       Filename
A New Marine Ascomycete from Brunei.    Invasive Species.csv
A new genus and four new species        Forestry.csv
A new genus and four new species        Invasive Species.csv
  

Я хочу знать, сколько уникальных «статей» имеет каждое «Имя файла».

Итак, мой желаемый результат таков:

 Filename                             Count_Unique
Invasive Species.csv                 1
Forestry.csv                         0
  

Другое дело, я также хотел бы получить этот результат:

 Filename1                        Filename2                         Count_Common articles
Forestry.csv                     Invasive Species.csv               1
  

Я объединил наборы данных и в итоге подсчитал элементы, которые существуют в каждом «Имени файла».

Кто-нибудь, кто готов помочь? Я пробовал unique(), drop_duplicates() etc, но, похоже, я не могу получить желаемый результат.

В любом случае, вот последние несколько строк моего кода:

 concatenated = pd.concat(data, ignore_index =True)
concatenatedconcatenated.groupby(['Title','Filename']).count().reset_index()
res = {col:concatenated[col].value_counts() for col in concatenated.columns}
res ['Filename']
  

Комментарии:

1. Почему «Forestry.csv» содержит 0 уникальных статей? Пожалуйста, определите, что вы подразумеваете под «уникальным», потому что это отличается от того, что люди обычно воспринимают.

2. Forestry.csv имеет значение «0», поскольку «Новый род и четыре новых вида» появились как в «Forestry.csv», так и в «Invasive Species.csv»

Ответ №1:

Никакой магии. Просто некоторые обычные операции.

(1) подсчет «уникальных» статей в файлах

Редактировать: добавлен (быстрый и грязный) код для включения имен файлов с нулевым количеством

 # prevent repetitive counting
df = df.drop_duplicates()

# articles to be removed (the ones appeared more than once)
dup_articles = df["Articles"].value_counts()
dup_articles = dup_articles[dup_articles > 1].index
# remove duplicate articles and count
mask_dup_articles = df["Articles"].isin(dup_articles)
df_unique = df[~mask_dup_articles]
df_unique["Filename"].value_counts()

# N.B. all filenames not shown here of course has 0 count.
#      I will add this part later on.

Out[68]: 
Invasive Species.csv    1
Name: Filename, dtype: int64

# unique article count with zeros
df_unique_nonzero_count = df_unique["Filename"].value_counts().to_frame().reset_index()
df_unique_nonzero_count.columns = ["Filename", "count"]

df_all_filenames = pd.DataFrame(
    data={"Filename": df["Filename"].unique()}
)
# join: all filenames with counted filenames
df_unique_count = df_all_filenames.merge(df_unique_nonzero_count, on="Filename", how="outer")
# postprocess
df_unique_count.fillna(0, inplace=True)
df_unique_count["count"] = df_unique_count["count"].astype(int)
# print
df_unique_count

Out[119]: 
               Filename  count
0  Invasive Species.csv      1
1          Forestry.csv      0
  

(2) подсчет общих статей между файлами

 # pick out records containing duplicate articles
df_dup = df[mask_dup_articles]
# merge on articles and then discard self- and duplicate pairs
df_merge = df_dup.merge(df_dup, on=["Articles"], suffixes=("1", "2"))
df_merge = df_merge[df_merge["Filename1"] > df_merge["Filename2"]] # alphabetical ordering
# count
df_ans2 = df_merge.groupby(["Filename1", "Filename2"]).count()
df_ans2.reset_index(inplace=True)  # optional
df_ans2

Out[70]: 
              Filename1     Filename2  Articles
0  Invasive Species.csv  Forestry.csv         1