python - Pandas .DataFrame : Filter rows of df A based on data in df B?

标签 python python-3.x pandas dataframe

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:

  1. 我的联系人:包含我所有 friend 的姓名和电话。
    请注意,有些 friend (例如 Alice)如果有多个电话号码,则会被列出两次。此 DataFrame 是一个常量,我无法(或不想)修改它。
  2. 我的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/

相关文章:

python - Pyinstaller 与 pygame

json - writer.writerow() 未写入正确的列

python-3.x - 模块未找到错误: No module named 'gather_keys_oauth2'

mysql - 当在 python 中插入多个数据帧时,没有从 mysql 获取值

python - Pandas:有条件地用集合替换

python - 编译后将 keras 层设置为不可训练会更改摘要中的总参数数量

python - 无法连接到 MySQL 服务器(连接被拒绝),尝试在 Django 和 MySQL 之间安装连接

python - 根据出现频率对(嵌套的)字符串列表进行排序

Python 3 : Why am I getting an AttributeError?

python - 使用索引按系列设置多索引 DataFrame 列