首页 > 解决方案 > 创建一个函数,该函数根据数据框中其他列的值创建一个新列

问题描述

以下是相关 DF 的简化版本:

  df = pd.DataFrame({'type': ['terrier', 'toy','toy','toy', 'hound' , 'terrier', 
                              'terrier', 'terrier','terrier', 'hound'],
                     'breed' : ['yorkshire_terrier', 'king_charles_spaniel', 'poodle', 'shih_tzu',
                                'greyhound', 'west_highland', 'bull_terrier' , 'fox_terrier', 
                                'west_highland', 'afghan']})

  df

     type             breed
0   terrier          yorkshire_terrier
1   toy              king_charles_spaniel
2   toy              poodle
3   toy              shih_tzu
4   hound            greyhound
5   terrier          west_highland
6   terrier          bull_terrier
7   terrier          fox_terrier
8   terrier          west_highland
9   hound            afghan

我想创建一个函数,它考虑每只狗的类型和品种,并根据这些字典的规则为其分配颜色:

toy = {'black' : ['poodle', 'shih_tzu'], 
       'mixed' : 'king_charles_spaniel'}

terrier = {'black_brown' : ['yorkshire_terrier','bull_terrier'],
           'white' : 'west_highland',
           'white_orange' : 'fox_terrier'}

hound = {'brindle' : 'greyhound',
           'brown' : 'afghan'}

下面的预期DF:

    type            breed                colour
0   terrier        yorkshire_terrier     black_brown
1   toy            king_charles_spaniel  mixed
2   toy            poodle                black
3   toy            shih_tzu              black
4   hound          greyhound             brindle
5   terrier        west_highland         white
6   terrier        bull_terrier          black_brown
7   terrier        fox_terrier           white_orange
8   terrier        west_highland         white
9   hound          afghan                brown

请注意,我希望解决方案采用函数的形式,以便能够将相同的解决方案应用于其他类似性质的 DF。

还请注意,虽然很遗憾此时没有在示例中表达,但重要的是要考虑类型和品种来确定颜色。

标签: python-3.xpandas

解决方案


通过首先创建一个函数来检索密钥,我能够获得您正在寻找的结果。

def get_key(dog_type, val):
    d = {'toy': toy, 'terrier':terrier, 'hound':hound}
    my_dict = d[dog_type]
    for key in my_dict.keys():
        if val in my_dict[key]:
            return key
        else:
            None

然后将该函数逐行应用于您的数据框,并将其应用到一个名为colour.

df['colour'] = df.apply(lambda row: get_key(row['type'], row['breed']), axis=1)

注意:在您给定的字典west highland中没有下划线,因此如果有任何breed条目,west_highland它将返回None.


推荐阅读