python - 合并两个数据框后,如何在两个条件下过滤结果?
问题描述
我有一个用户之间共同信息的数据框,由以下人员组成:
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 的用户有多少个用户是 classX
的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()
但是,它崩溃了,因为它是 aSeries
它需要在-condition on内使用a.any()
ora.all()
等。and
res
避免使用显式 for,我该如何解决这个问题?
谢谢!
解决方案
我只是写了问题的解决方案:我通过使用@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
谢谢你的回答!
推荐阅读
- javascript - 为什么我无法获得变量中的值?
- ios - Error while compiling the project with an Xcode 9.3
- python - Python: finding the index of a list into a list of list
- c# - 订阅验证错误处理
- python-3.x - How to Play Sound in Odoo with Single Device Running
- angular - 从后端服务器访问图像的 URL 格式
- php - Cache PHP extensions installed with Pecl on CircleCI
- python - 在 Pandas 中聚合多个 dtype 时如何获得一致的行为?
- python - How to plot a power curve by following code?
- typescript - 无法将字符串值分配给打字稿枚举(初始化程序类型字符串不可分配给变量类型)