import pandas as pd

C = {'name': ['Alice', 'Alice', 'Bob', 'Charlie'], 'phone': ['007', '1764', '1317210', '314159']}
CONTACTS = pd.DataFrame(data = C)

answer = {'guest_name': ['Alice', 'Bob', 'Charlie'], 'attending': [True, False, True]}
guest_list = pd.DataFrame(data = answer)




说明性上下文:
我要开一个派对,但是位置有最后一刻修改。因此,我想给客人说他们会来。

我有两个pandas.DataFrame


我的CONTACTS:带有我所有朋友的名字和电话。请注意,如果某些朋友(例如爱丽丝)有多个电话号码,则会列出两次。这个DataFrame是一个常量,我无法(或不想)对其进行修改。
我的guest_list:带有我所有朋友的姓名和参加状态(布尔值)。请注意,与CONTACTS不同,这里仅列出一次朋友名称。 name中列出的所有朋友CONTACTS都存在于guest_list中,反之亦然(换句话说,CONTACTS.name表示guest_list.guest_name的宾语)。


问题:我想创建一个attending_guests_contact数据框,其中包含仅参加聚会的朋友的联系方式。

问题:如何基于CONTACTS布尔值获取answer.attending的子集?

注意:


我不想修改CONTACTS
我宁愿不创建CONTACTS的副本,因为我有“很多”联系人(〜10 ^ 3–10 ^ 4)并引发了多个参与者,因此这将浪费时间和内存(即,我想进行子选择)。




编辑:两个DataFrame不再共享相同的标签列。

最佳答案

首先通过布尔值guest_list列过滤attending。第二次检查attending中是否存在guest_list中的CONTACTS名称

CONTACTS[CONTACTS.name.isin(guest_list.loc[guest_list.attending,'guest_name'])]

    name   phone
0    Alice     007
1    Alice    1764
3  Charlie  314159

关于python - pandas.DataFrame:是否根据DF B中的数据过滤DF A中的行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49821843/

10-12 17:04