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
:用我所有朋友的名字和电话。 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不再共享相同的标记列。
答案 0 :(得分:2)
这是一种方式:
attending_guests_contact = CONTACTS.merge(guest_list[guest_list.attending], \
left_on="name", right_on="guest_name")
print attending_guests_contact
# name phone attending
# 0 Alice 007 True
# 1 Alice 1764 True
# 2 Charlie 314159 True
这使用布尔索引将guest_list
仅过滤到attending
为真的行,然后使用{{3}在guest_list
和CONTACTS
之间执行内部联接}。
答案 1 :(得分:1)
首先按布尔值guest_list
列筛选attending
。请先检查attending
guest_list
的{{1}}个名称
CONTACTS