合并两个数据框后,如何在两个条件下过滤结果之一?

时间:2020-04-25 17:43:26

标签: python pandas dataframe

我有一个用户之间共同信息的数据框,由以下人员组成:

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

及其活动的另一个数据框,该数据框由以下内容组成:

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

问题是:

fer个拥有特定类别的用户中有多少个拥有另一个类别的用户?

例如,如果问题是:类别X的用户中ferY个用户,那么结果应该是: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()的{​​{1}}条件内需要a.all()and等。

避免使用显式的,我该如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

我只是编写问题的解决方案:我通过使用@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

谢谢您的回答!