在Python中映射类别

时间:2017-09-14 04:03:02

标签: python

我有一个大型数据集,其中一列是公司类型列表。我注意到他们中很多都有类似的类型描述。例如,“手术器具”和“手术器械”可以简化为“手术”。然后“眼镜”,“眼科”“验光”可以简化为“眼镜”。如何在Python中编写代码,以便它遍历列中的每个项目并将其简化为一个组?有点像:

for i= 1:n
    if df['Company Type'][i] contains 'Surgical'
       then df['Company Type'] == 'Surgical'
    else if df[Company Type][i] contains optometry, opthalamy
        then df['Company Type'] == 'Eyewear'

如果这个问题有点模糊,我道歉。我真的不知道如何开始这个 谢谢

2 个答案:

答案 0 :(得分:1)

最好的方法是使用熊猫。将数据框加载到pandas,比如数据框的名称是df。

然后你所要做的就是,

df['Company Name'] = df['Company Name'].map(d)

其中d是字典。在你的情况下,由于你正在使用'包含',它有点复杂。在那种情况下,我会做一个像这样的函数

def map_company(row):
    company = row['Company Name']
    if company in 'Surgical':
         return 'Surgical'
    #include more elif statements here

df['Company Name'] = df.apply(lambda x: map_company(x),axis=1)

更好的方法是使用显示的pandas的.str.extract方法here.

为所有公司名称编写正则表达式,此函数将返回带有匹配子字符串的新列。

答案 1 :(得分:0)

假设所有子扇区都是唯一的,您可以创建子扇区的字典,然后将其反转。使用反向字典将子扇区(Company Type)映射到适当的扇区。

groups = { 
    "Surgical": ["Surgical appliances", "Surgical Instruments"],
    "Eyewear": ["eyewear", "ophthalmic", "optometry"]
}
reversed_groups = {v: k for k in groups for v in groups[k]}

df = pd.DataFrame({'company': list('ABCDE'), 'Company Type': reversed_groups.keys()})
>>> df
           Company Type company
0             optometry       A
1            ophthalmic       B
2  Surgical Instruments       C
3   Surgical appliances       D
4               eyewear       E

>>> df.assign(sector=df['Company Type'].map(reversed_groups))
           Company Type company    sector
0             optometry       A   Eyewear
1            ophthalmic       B   Eyewear
2  Surgical Instruments       C  Surgical
3   Surgical appliances       D  Surgical
4               eyewear       E   Eyewear