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
:
- 我的
联系人
:包含我所有 friend 的姓名和电话。
请注意,有些 friend (例如 Alice)如果有多个电话号码,则会被列出两次。此 DataFrame 是一个常量,我无法(或不想)修改它。 - 我的
guest_list
:包含我所有 friend 的姓名和出席状态( bool 值)。
请注意,与CONTACTS
不同, friend 姓名仅在此处列出一次。CONTACTS
中列出的所有好友name
都存在于guest_list
中,反之亦然(换句话说,CONTACTS.name
是满射到guest_list.guest_name
)。
问题:
我想创建 attending_guests_contact
DataFrame,其中包含仅参加聚会的 friend 的联系方式。
问题:
如何根据 answer.attending
bool 值获取 CONTACTS
的子集?
请注意:
- 我不想修改
联系人
, - 我不想创建
CONTACTS
的副本,因为我有“很多”联系人 (~10^3—10^4) 且有多方参与,所以需要时间和精力消耗内存(即我想在线执行子选择)。
编辑:两个 DataFrame 不再共享相同的标记列。
最佳答案
这是一种方法:
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
这使用 bool 索引将 guest_list
过滤为仅 attending
为 true 的行,然后在 guest_list
和 联系人
.merge
.
关于python - Pandas .DataFrame : Filter rows of df A based on data in df B?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49821843/