Python 如果列字符串包含X和[Y,Z]中的至少一个,则捕获行

Python 如果列字符串包含X和[Y,Z]中的至少一个,则捕获行,python,pandas,Python,Pandas,我的数据是这样的,家庭成员有三种不同的出身(荷兰、美国、法国): 我想把它们分为三类: 荷兰家庭 拥有1名荷兰人和至少1名法国人或美国人的家庭 非荷兰家庭 类别1由以下代码捕获: ~df['households'].str.contains("French", "American") 我在寻找第2类和第3类的解决方案。我的想法如下: Mixed households df['households'].str.contains("Dutch&qu

我的数据是这样的,家庭成员有三种不同的出身(荷兰、美国、法国):

我想把它们分为三类:

  • 荷兰家庭
  • 拥有1名荷兰人和至少1名法国人或美国人的家庭
  • 非荷兰家庭
  • 类别1由以下代码捕获:

    ~df['households'].str.contains("French", "American")
    
    我在寻找第2类和第3类的解决方案。我的想法如下:

    Mixed households
    df['households'].str.contains("Dutch" and ("French" or "American"))
    
    但这个解决方案不起作用,因为它还捕获了只包含法国成员的行。
    如何在此上下文中正确执行此“and”语句?

    让我们尝试
    str.get_dummies
    为列
    Househouse
    创建虚拟指标变量的数据帧,然后根据指定条件创建布尔掩码
    m1、m2、m3
    ,最后使用这些掩码过滤掉行:

    c = df['Household'].str.get_dummies(sep=' ')
    m1 = c['Dutch'].eq(1) & c[['American', 'French']].eq(0).all(1)
    m2 = c['Dutch'].eq(1) & c[['American', 'French']].eq(1).any(1)
    m3 = c['Dutch'].eq(0)
    
    详细信息:

    >>> c
    
       American  Dutch  French
    0         1      1       1
    1         0      1       1
    2         1      0       0
    3         1      1       0
    4         1      0       1
    5         0      1       0
    
    >>> df[m1] # category 1
    
         Household
    5  Dutch Dutch
        
    >>> df[m2] # category 2
    
                         Household
    0  Dutch American Dutch French
    1           Dutch Dutch French
    3               American Dutch
    
    >>> df[m3] # category 3
    
               Household
    2  American American
    4    French American
    
    >>> c
    
       American  Dutch  French
    0         1      1       1
    1         0      1       1
    2         1      0       0
    3         1      1       0
    4         1      0       1
    5         0      1       0
    
    >>> df[m1] # category 1
    
         Household
    5  Dutch Dutch
        
    >>> df[m2] # category 2
    
                         Household
    0  Dutch American Dutch French
    1           Dutch Dutch French
    3               American Dutch
    
    >>> df[m3] # category 3
    
               Household
    2  American American
    4    French American