我有一个用户之间共同信息的数据框,由以下人员组成:
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
的用户中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()
的{{1}}条件内需要a.all()
或and
等。
避免使用显式的,我该如何解决这个问题?
谢谢!
答案 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
谢谢您的回答!