将列内容分配给类别

时间:2018-03-28 10:41:28

标签: python-3.x pandas

我有一个数据框,其中包含一个较大组的一个子实例列,并希望将其分类为较少数量的组。我该怎么做?

考虑以下示例数据:

df = pd.DataFrame({     
'a':np.random.randn(60),
'b':np.random.choice( [5,7,np.nan], 60),
'c':np.random.choice( ['panda', 'elephant', 'python', 'anaconda', 'shark', 'clown fish'], 60),

# some ways to create systematic groups for indexing or groupby
'e':np.tile(   range(20), 3 ),

# a date range and set of random dates
})

我现在想要一个新的行,例如熊猫和大象被归类为哺乳动物等。

2 个答案:

答案 0 :(得分:1)

最直观的是创建一个新系列,创建一个dict,然后根据它重新映射:

mapping_dict = {'panda': 'mammal', 'elephant': 'mammal', 'python': 'snake', 'anaconda': 'snake', 'shark': 'fish', 'clown fish': 'fish'}

c_Series = pd.Series(df['c'])     # create new series
classified_c = c_Series.map(mapping_dict)     # remap new series
if 'c_classified' not in df.columns: df.insert(3, 'c_classified', classified_c) # insert if not in df already (if you want to run the code multiple times

答案 1 :(得分:0)

如果非匹配值,我认为需要mapfillna替换NaN

#borrowed dict from Ivo's answer
mapping_dict = {'panda': 'mammal', 'elephant': 'mammal', 
               'python': 'snake', 'anaconda': 'snake', 
               'shark': 'fish', 'clown fish': 'fish'}

df['d'] = df['c'].map(mapping_dict).fillna('not_matched')

此外,如果可以更改字典的格式,则使用带有值的交换键生成最终的字典:

d = {'mammal':['panda','elephant'], 
     'snake':['python','anaconda'], 
     'fish':['shark','clown fish']}
mapping_dict = {k: oldk for oldk, oldv in d.items() for k in oldv}

df['d'] = df['c'].map(mapping_dict).fillna('not_matched')