【问题标题】:Pandas select match multiple columns熊猫选择匹配多列
【发布时间】:2021-12-21 15:26:44
【问题描述】:

我有这样的数据:

category = ['Car','Car','Car','Car','Truck','Truck','Truck']
name = ['Camry','Camry','Camry','Camry','Tacoma','Tundra','Tundra']
year = ['2007','2007','2008','2009','2010','2010','2011']
vals = [0.1,0.5,0.2,0.9,0.8,0.4,0.9]
df = pd.DataFrame({'Category': category,
                   'Name': name,
                   'Year': year,
                   'Vals': vals})
index Category Name Year Vals
0 Car Camry 2007 0.1
1 Car Camry 2007 0.5
2 Car Camry 2008 0.2
3 Car Camry 2009 0.9
4 Truck Tacoma 2010 0.8
5 Truck Tundra 2010 0.4
6 Truck Tundra 2011 0.9

然后,我有一组(类别、名称、年份)组合,我想为其过滤数据框。它们可以是任何格式,但在这里它们位于数据框中。

combinations_i_want = pd.DataFrame()
# (Car, Camry, 2007)
combinations_i_want = combinations_i_want.append({'Category':'Car', 'Name':'Camry','Year':'2007'},ignore_index=True) # 2 matches in df
# (Truck, Tundra, 2010)
combinations_i_want = combinations_i_want.append({'Category':'Truck', 'Name':'Tundra','Year':'2010'},ignore_index=True) # 1 match in df

我想提取 df 中与这两种组合完全匹配的行。这些将是第 0、1 和 5 行。结果表如下所示:

index Category Name Year Vals
0 Car Camry 2007 0.1
1 Car Camry 2007 0.5
5 Truck Tundra 2010 0.4

注意:我不需要旧索引,它们只是为了帮助可视化。

我该怎么做?

【问题讨论】:

    标签: pandas multi-index


    【解决方案1】:

    使用数据框查询,它将根据布尔逻辑为您提供完美匹配

    print(df.query("(Category=='Car' and Name=='Camry' and Year=='2007') or (Category=='Truck' and Name=='Tundra' and Year=='2010')"))
    

    输出:

         Category    Name  Year  Vals
       0      Car   Camry  2007   0.1
       1      Car   Camry  2007   0.5
       5    Truck  Tundra  2010   0.4
    

    【讨论】:

      【解决方案2】:

      您可以简单地右加入您想要的列。

      result = df.merge(combinations_i_want, how='right', on=['Category', 'Name', 'Year'])
      

      【讨论】:

        【解决方案3】:

        您应该使用.loc.isin 而不是.append

        你的句子可能是这样的:

        df.loc[(df['Category'].isin(['Car', 'Truck'])) & (df['Name'].isin(['Camry', 'Tundra'])) & (df['Year'].isin(['2007', '2010']))]
        

        这应该会产生您期望的结果。

        如果需要,您可以将其分配给变量,例如

        combinations_i_want = df.loc[(df['Category'].isin(['Car', 'Truck'])) &
                 (df['Name'].isin(['Camry', 'Tundra'])) &
                 (df['Year'].isin(['2007', '2010']))]
            
        print(combinations_i_want)
        

        【讨论】:

        • 在我的真实数据中,可能存在一个假设(Car, Tundra, 2010),这意味着我需要每一列都完美匹配。
        • 我相信 OP 的意思是他们想要与他们之前指定的组合行完全匹配的行,这基本上是一个 sql 连接。
        • @rdk 那么您可以使用| 而不是& 将选项打开为一个或另一个。
        猜你喜欢
        • 1970-01-01
        • 2017-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 2015-05-28
        • 1970-01-01
        相关资源
        最近更新 更多