【问题标题】:How to filter pandas dataframe rows based on dictionary keys and values?如何根据字典键和值过滤熊猫数据框行?
【发布时间】:2021-12-25 20:57:35
【问题描述】:

我在 Python 中有一个数据框和一个字典,如下所示,我需要根据字典过滤数据框。如您所见,字典的键和值是数据框的两列。我想要一个数据框的子集,其中包含字典的键和值以及其他列。

df :

Customer_ID Category Type Delivery
40275 Book Buy True
40275 Software Sell False
40275 Video Game Sell False
40275 Cell Phone Sell False
39900 CD/DVD Sell True
39900 Book Buy True
39900 Software Sell True
35886 Cell Phone Sell False
35886 Video Game Buy False
35886 CD/DVD Sell False
35886 Software Sell False
40350 Software Sell True
28129 Software Buy False

字典是:

d = {
 40275: ['Book','Software'],
 39900: ['Book'],
 35886: ['Software'],
 40350: ['Software'],
 28129: ['Software']
 }

我需要以下数据框:

Customer_ID Category Type Delivery
40275 Book Buy True
40275 Software Sell False
39900 Book Buy True
35886 Software Sell False
40350 Software Sell True
28129 Software Buy False

【问题讨论】:

    标签: python pandas dataframe dictionary


    【解决方案1】:

    我们可以set_indexCustomer_IDCategory 列,然后从字典dreindex DataFrame 中构建一个元组列表,以仅包含与元组列表匹配的行,然后@ 987654323@恢复列:

    new_df = df.set_index(['Customer_ID', 'Category']).reindex(
        [(k, v) for k, lst in d.items() for v in lst]
    ).reset_index()
    

    new_df:

       Customer_ID  Category  Type  Delivery
    0        40275      Book   Buy      True
    1        40275  Software  Sell     False
    2        39900      Book   Buy      True
    3        35886  Software  Sell     False
    4        40350  Software  Sell      True
    5        28129  Software   Buy     False
    

    *注意,这仅在 MultiIndex 是 unique 时才有效(如所示示例)。如果字典不代表 DataFrame 的 MultiIndex 的子集(这可能是也可能不是所需的行为),它也会添加行。


    设置:

    import pandas as pd
    
    d = {
        40275: ['Book', 'Software'],
        39900: ['Book'],
        35886: ['Software'],
        40350: ['Software'],
        28129: ['Software']
    }
    
    df = pd.DataFrame({
        'Customer_ID': [40275, 40275, 40275, 40275, 39900, 39900, 39900, 35886,
                        35886, 35886, 35886, 40350, 28129],
        'Category': ['Book', 'Software', 'Video Game', 'Cell Phone', 'CD/DVD',
                     'Book', 'Software', 'Cell Phone', 'Video Game', 'CD/DVD',
                     'Software', 'Software', 'Software'],
        'Type': ['Buy', 'Sell', 'Sell', 'Sell', 'Sell', 'Buy', 'Sell', 'Sell',
                 'Buy', 'Sell', 'Sell', 'Sell', 'Buy'],
        'Delivery': [True, False, False, False, True, True, True, False, False,
                     False, False, True, False]
    })
    

    【讨论】:

      【解决方案2】:

      展平字典并创建一个新的数据框,然后在内部 merge df 使用新的数据框

      df.merge(pd.DataFrame([{'Customer_ID': k, 'Category': i} 
                             for k, v in d.items() for i in v]))
      

         Customer_ID  Category  Type  Delivery
      0        40275      Book   Buy      True
      1        40275  Software  Sell     False
      2        39900      Book   Buy      True
      3        35886  Software  Sell     False
      4        40350  Software  Sell      True
      5        28129  Software   Buy     False
      

      【讨论】:

        【解决方案3】:

        您可以将df.mergedf.append 一起使用:

        In [444]: df1 = pd.DataFrame.from_dict(d, orient='index', columns=['Cat1', 'Cat2']).reset_index()
        
        In [449]: res = df.merge(df1[['index', 'Cat1']], left_on=['Customer_ID', 'Category'], right_on=['index', 'Cat1']).drop(['index', 'Cat1'], 1)
        
        In [462]: res = res.append(df.merge(df1[['index', 'Cat2']], left_on=['Customer_ID', 'Category'], right_on=['index', 'Cat2']).drop(['index', 'Cat2'], 1)).sort_values('Customer_ID', ascending=False)
        
        In [463]: res
        Out[463]: 
           Customer_ID  Category  Type  Delivery
        3        40350  Software  Sell      True
        0        40275      Book   Buy      True
        0        40275  Software  Sell     False
        1        39900      Book   Buy      True
        2        35886  Software  Sell     False
        4        28129  Software   Buy     False
        

        【讨论】:

          猜你喜欢
          • 2021-12-12
          • 1970-01-01
          • 2020-06-23
          • 2015-12-13
          • 1970-01-01
          • 2013-06-09
          • 1970-01-01
          • 2020-08-08
          • 1970-01-01
          相关资源
          最近更新 更多