[英]How to use a dictionary and isin()?
我有一个字典,我想使用该字典对df中的新列进行分类。 应将df中的“ Value
列与字典中的值进行比较。 df中的新列应为与该值关联的键。
d = {'Car':['1','2','3'],
'Chicken legs':['4','5','6'],
'Coronary artery bypass graft surgery':['7','8','9','10','11','12']}
DF
Color Style Value
red round 1
blue square 5
green triangle 9
orange sphere 12
最终df
Color Style Value Thing
red round 1 Car
blue square 5 Chicken legs
green triangle 9 Coronary artery bypass graft surgery
orange sphere 12 Coronary artery bypass graft surgery
我的第一个倾向是将其放入df(df_dict)中,但是我很难将df中的单个值与df_dict中的列表进行比较。
df_dict = pd.DataFrame({'Thing':list(d.keys()), 'Values':list(d.values())})
Thing Values
0 Car [1, 2, 3]
1 Chicken_legs [4, 5, 6]
2 Coronary artery bypass graft surgery [7, 8, 9, 10, 11, 12]
以下代码适用于单个元素。 但是我的字典有32个元素,我想有一个比仅创建下面32个代码版本更好的方法。 我只是不知道这种方法会是什么。
df.loc[df['Value'].isin(['1', '2', '3]),'Thing']='Car'
是否可以使用字典和isin()
? 我应该改为将字典转换为列表吗?
更好的是,将字典反向,这样您将获得以下内容:
v_map = {
1: 'Car', 2: 'Car', 3: 'Car',
4: 'Chicken legs', 5: 'Chicken legs', 6: 'Chicken legs',
7: 'Coronary artery bypass graft surgery',
...
12: 'Coronary artery bypass graft surgery'
}
现在,您的新列仅是为新列中的字符串插入v_map[df['Value']]
的问题。
您可以为此创建一个辅助函数:
In [60]: def argcontains(item):
...: for i, v in d.items():
...: if item in v:
...: return i
...:
然后map
其map
到适当的列:
In [61]: df['thing'] = df.Value.map(argcontains)
In [62]: df
Out[62]:
Value thing
0 1 Car
1 5 Chicken legs
2 9 Coronary artery bypass graft surgery
3 12 Coronary artery bypass graft surgery
这可能会更通用(并避免每次都重新计算d.items()
,尽管那是很小的事情),例如:
In [73]: def argcontains2(item_iterator, item):
...: for i, v in item_iterator:
...: if item in v:
...: return i
...:
In [74]: from functools import partial
In [75]: argcontains = partial(argcontains2, d.items())
如果您将需要经常按值引用d
的数据,那么最好在另一个答案中提到创建数据的反向索引(反向字典)。
但是,如果出于构造此列的目的只需要一次反向查找,则它将使用较少的内存,并且需要较少的计算才能使用如上所示的简单循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.