在Python中映射类别

2024-06-01 01:51:40 发布

您现在位置: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'

如果这个问题有点含糊,我很抱歉。我真的不知道该怎么开始 谢谢


Tags: 数据类型df列表iftype公司company
2条回答

最好的办法就是利用熊猫。将数据帧加载到pandas,比如说数据帧的名称是df。你知道吗

你要做的就是

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

其中d是字典。在您的例子中,由于您使用的是“contains”,所以它要复杂一些。如果是这样的话,我会做一个这样的函数

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)

更好的方法是使用。结构提取物方法here.

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

假设所有的子扇区都是唯一的,您可以创建一个扇区到子扇区的字典,然后将其反转。使用反向字典将子扇区(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

相关问题 更多 >