После слияния двух DataFrames, как отфильтровать получившийся кадр по двум условиям? - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть Dataframe общей информации среди пользователей, состоящий из:

user class
A    X
B    Y
C    Z
D    Y
E    Y
F    X

и другой Dataframe их деятельности, состоящий из:

fing fer
A    B
A    E
B    D
B    C
B    F
C    A
D    E
E    B
F    D

Вопрос:

Сколько пользователей, которые имеют определенный класс, fer других пользователей, которые имеют другой класс?

Например, если возникает вопрос: сколько пользователей класса X являются fer пользователями класса Y, результат должен быть: 3, потому что есть только A, F, которые имеют класс X и их отношения:

find fer
A    B
A    E
F    D

Я пытался сейчас следующее:

fing_table = pd_ci.merge(pd_f, how="right", left_on="user", right_on="fing")
fing_table.dropna(inplace=True)
fer_table = pd_ci.merge(pd_f, how="right", left_on="user", right_on="fer")
fer_table.dropna(inplace=True)
fs = fing_table.merge(fer_table, how="right", left_on="fing", right_on="fer").drop_duplicates(keep="first")

res = fs[fs["class"] == category_to and fs["class"] == category_from]
return res["user_x"].count()

Но происходит сбой, потому что, поскольку это Series, ему потребуется либо a.any(), либо a.all() et c. внутри and -условия res.

Как избежать использования явного выражения для, как я могу решить эту проблему?

Спасибо!

1 Ответ

0 голосов
/ 26 апреля 2020

Я просто пишу решение проблемы: я решаю проблему, используя фрагмент кода, предложенный @anky, а именно:

def fs_from_class_to_class(
    pd_ci: pd.DataFrame,
    pd_f: pd.DataFrame,
    class_from: str,
    class_to: str
) -> int:
   pd_f = pd_f.assign(fing_class=pd_f["fing"].map(pd_ci.set_index("user")["class"]))\
           .assign(fer_class=pd_f["fer"].map(pd_ci.set_index("user")["class"]))
   counter = pd_f.loc[(pd_f["fer_class"] == class_from) & (pd_f["fing_class"] == class_to)]
   counter = counter["fing"].count()
   return counter

Спасибо за ответ!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...