pandas.DataFrame:根据df B中的数据过滤df A行?

时间:2018-04-13 16:54:43

标签: 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. 我的CONTACTS:用我所有朋友的名字和电话。
    请注意,如果某些朋友(例如Alice)有多个电话号码,则会列出两次。这个DataFrame是一个常量,我不能(或不想)修改它。
  2. my guest_list:以我所有朋友的名字和出席状态(布尔值)。
    请注意,与CONTACTS不同,朋友名称仅列在此处一次。 name中列出的所有朋友CONTACTS都存在于guest_list中,反之亦然(换句话说,CONTACTS.nameguest_list.guest_name感到满意。
  3. 问题:
    我想创建attending_guests_contact数据框,其中包含仅参加聚会的朋友的联系方式。

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

    请注意:

    • 我不想修改CONTACTS
    • 我不想创建CONTACTS的副本,因为我有很多联系人(~10 ^ 3-10 ^ 4)并且抛出了多方,因此会花费时间和内存(即我想在线进行分选。

    修改:两个DataFrame不再共享相同的标记列。

2 个答案:

答案 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_listCONTACTS之间执行内部联接}。

答案 1 :(得分:1)

首先按布尔值guest_list列筛选attending。请先检查attending

中是否存在来自guest_list的{​​{1}}个名称
CONTACTS