繁体   English   中英

如何使用字典和isin()?

[英]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
    ...:

然后mapmap到适当的列:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM