DataFrame Python и объединение списков - PullRequest
0 голосов
/ 21 октября 2019

В настоящее время у меня есть pandas DataFrame df:

         paper     reference
2171686  p84       r51
3816503  p41       r95
4994553  p112      r3
2948201  p112      r61
2957375  p32       r41
2938471  p65       r41
...

Здесь каждая строка df показывает отношение цитирования между paper и reference (где papercites reference).

Мне нужны следующие цифры для моего анализа:

  1. Частота элементов paper в df

  2. Когда два элемента из paper выбраны случайным образом, число reference, которое они приводят вместе

Для номера 1 я выполнил следующее:

df_count = df.groupby(['paper'])['paper'].count()

Для числа 2 я выполнил операцию, которая возвращает пары элементов в paper, которые ссылаются на один и тот же элемент в reference:

from collections import defaultdict

pair = []
d = defaultdict(list)
for idx, row in df.iterrows():
    d[row['paper']].append(row['paper'])
for ref, lst in d.items():
    for i in range(len(lst)):
        for j in range(i+1, len(lst)):
            pair.append([lst[i], lst[j], ref])

pair - это список, которыйсостоит из трех элементов: первые два элемента представляют собой пару paper, а третий элемент относится к reference, на который ссылаются оба paper элемента. Ниже показано, как выглядит pair:

[['p88','p7','r11'],
['p94','p33','r11'],
['p75','p33','r43'],
['p5','p12','r79'],
...]

Я хотел бы получить DataFrame в следующем формате:

paper1      freq1       paper2       freq2        common
p17         4           p45          3            2
p5          2           p8           5            2
...

, где paper1 и paper2 представляют первоедва элемента каждого списка pair, freq1 и freq2 представляют счетчик частоты каждой бумаги, выполненной с помощью df_count, а common - это число reference и paper1 и paper2 цитироватьв общих чертах.

Как мне получить желаемый набор данных (в нужном формате) из df, df_count и pair?

1 Ответ

1 голос
/ 21 октября 2019

Я думаю, что это можно решить только с помощью pandas.DataFrame.merge . Однако я не уверен, является ли это наиболее эффективным способом.

Во-первых, сгенерируйте общее число ссылок:

# Merge the dataframe with itself to generate pairs
# Note that we merge only on reference, i.e. we generate each and every pair
df_pairs = df.merge(df, on=["reference"])

# Dataframe contains duplicate pairs of form (p1, p2) and (p2, p1), remove duplicates
df_pairs = df_pairs[df_pairs["paper_x"] < df_pairs["paper_y"]]

# Now group by pairs, and count the rows
# This will give you the number of common references per each paper pair
# reset_index is necessary to get each row separately
df_pairs = df_pairs.groupby(["paper_x", "paper_y"]).count().reset_index()
df_pairs.columns = ["paper1", "paper2", "common"]

Во-вторых, сгенерируйте количество ссылок на бумагу (вы уже получили это):

df_refs = df.groupby(["paper"]).count().reset_index()
df_refs.columns = ["paper", "freq"]

В-третьих, объедините два кадра данных:

# Note that we merge twice to get the count for both papers in each pair
df_all = df_pairs.merge(df_refs, how="left", left_on="paper1", right_on="paper")
df_all = df_all.merge(df_refs, how="left", left_on="paper2", right_on="paper")

# Get necessary columns and rename them
df_all = df_all[["paper1", "freq_x", "paper2", "freq_y", "common"]]
df_all.columns = ["paper1", "freq1", "paper2", "freq2", "common"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...