【问题标题】:Pandas/Python create columns based on multiple conditions with a dictionaryPandas/Python 使用字典根据多个条件创建列
【发布时间】:2021-01-11 08:33:14
【问题描述】:

我正在寻找一种更短、更优雅的方式来编写以下条件,假设我有 30 种不同的组合。是否可以映射具有多个条件或其他内容的某种字典?

def set_name(df):
    if df['PRODUCT'] == 'A' and df['TYPE'] == 'C2':
        return 'AAC2'
    elif df['PRODUCT'] == 'A' and df['TYPE'] == 'C3':
        return 'AAC3'
    elif df['PRODUCT'] == 'B' and df['TYPE'] == 'C2':
        return 'BBC"'
    
df['RETURN'] = df.apply(set_name, axis=1)

如果我有很多组合,下面的另一种方法仍然很长。

conditions = [
    (df['PRODUCT'] == 'A') & (df['TYPE'] == 'C2'),
    (df['PRODUCT'] == 'A') & (df['TYPE'] == 'C3')
]

values = ['AAC2', 'AAC3']

df['RETURN'] = np.select(conditions, values)

【问题讨论】:

    标签: python pandas dictionary multiple-columns


    【解决方案1】:

    创建助手DataFrame并使用DataFrame.merge的左连接:

    products = ['A','A']
    types = ['C2','C3']
    values = ['AAC2', 'AAC3']
    
    df1 = pd.DataFrame({'PRODUCT':products,
                        'TYPE':types,
                        'RETURN': values})
    
    
    df = df.merge(df1, on=['PRODUCT','TYPE'], how='left')
    

    【讨论】:

      【解决方案2】:

      您可以使用两级字典或以 (product,type) 元组为键的字典:

      两级字典...

      mapping = {
                  'A': {'C2':'AAC2', 'C3':'AAC3'},
                  'B': {'C2':'BBC'}
                } 
                  
      def set_name(df):
          product, ptype = df['PRODUCT'], df['TYPE']
          if product in mapping and ptype in mapping[product]:
              return mapping[product][ptype]
          else:
              # handle no-mapping situations
                                         
      
          
      df['RETURN'] = df.apply(set_name, axis=1)
      

      或者,使用元组键 ...

      mapping = {
                  ('A','C2'): 'AAC2',
                  ('A','C3'): 'AAC3',
                  ('B','C2'): 'BBC'
                } 
                  
      def set_name(df):
          product, ptype = df['PRODUCT'], df['TYPE']
          if (product,ptype) in mapping:
              return mapping[product,ptype]
          else:
              # handle no-mapping situations
                                      
          
      df['RETURN'] = df.apply(set_name, axis=1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-02
        • 2018-07-09
        • 2020-11-21
        • 2017-04-10
        • 2021-08-27
        相关资源
        最近更新 更多