我有一个大型数据集,其中一列是公司类型列表。我注意到他们中很多都有类似的类型描述。例如,“手术器具”和“手术器械”可以简化为“手术”。然后“眼镜”,“眼科”“验光”可以简化为“眼镜”。如何在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'
如果这个问题有点模糊,我道歉。我真的不知道如何开始这个 谢谢
答案 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