如何在一个数据帧中发现两个实体是否在同一个组中?

2024-06-17 08:00:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有如下数据帧:

       City     Name
0   Seattle    Alice
1   Seattle      Bob
2  Portland  Mallory       
3  Portland      Bob

给定两个名字,我想知道它们是否在同一个地方。 什么是有效的方法? 我在考虑按“城市”分组,但我不知道如何检查两个名字是否在同一组中。你知道吗

(我使用的数据帧要大得多,有数百万行,我想多次在同一个城市找到两个或更多的人)


Tags: 数据方法namecity地方名字bobalice
3条回答

试试这个:

def bothInCity(df, n1, n2):
    s = {n1, n2}
    c = df.groupby('City').Name.apply(set)
    chk = lambda x: s.issubset(x)
    return c.loc[c.apply(chk)]

然后像这样使用:

bothInCity(df, 'Bob', 'Alice')

City
Seattle    {Bob, Alice}
Name: Name, dtype: object

您可以使用:

names = ['Alice', 'Bob']
df[df.Name.isin(names)].groupby('City').Name.nunique() > 1

收益率

City
Portland    False
Seattle      True
Name: Name, dtype: bool

(..).any()括起来以获得摘要True/False结果。你知道吗

如果一个人可以在同一个City中多次出现,您可以先使用.drop_duplicates(['Name', 'City')。你知道吗

包装在函数中:

def same_city(df, n1, n2):
    same = df[df.Name.isin(names)].groupby('City').Name.nunique() > 1
    return same, same.any()

result, summary = same_city(df, 'Alice', 'Bob')

收益率:

City
Portland    False
Seattle      True
Name: Name, dtype: bool
True

使用groupby的一种可能方法:

x = "Mallory"
y = "Alice"
any(any(names[1].str.contains(x)) and any(names[1].str.contains(y)) for names in df.groupby('City').Name)

# False

相关问题 更多 >