首页 > 解决方案 > 合并两个数据框后,如何在两个条件下过滤结果?

问题描述

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

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的用户属于其他具有另一个类的用户?

例如,如果问题是:class 的用户有多少个用户是 classXfer用户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()

但是,它崩溃了,因为它是 aSeries它需要在-condition on内使用a.any()ora.all()等​​。andres

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

谢谢!

标签: pythonpandasdataframe

解决方案


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

谢谢你的回答!


推荐阅读