python:为字典键分配多个值,并用键替换列值

时间:2017-08-23 03:29:51

标签: python pandas

我有一个数据集,其中包含属于相同类别但名称不同的值。我正在考虑创建一个字典,其中的键分配给多个值,然后用键替换列中的值。这就是我拥有的和我想要实现的目标。

定义字典

sspdict={'Eva':["M-EV", "G-EV"],'Re Sci': ['G-RESC', 'M-RESC', 'S-RESC', 'D-RESC'], 'Ed':['G-PO' , 'M-PO'], 'Global':['C-GCC', 'D-GCLA', 'C-LACL']}

数据集:

Col1  Col2  Col3
12    No     M-EV
22    Yes    G-EV
23    Yes    G-RESC
35    No     M-PO
34    Yes    D-GCLA
46    No     S-RESC
89    No     G-PO
90    Yes    C-GCC

期望的结果

Col1  Col2  Col3
12    No     Eva
22    Yes    Eva
23    Yes    Re Sci
35    No     Ed
34    Yes    Global
46    No     Re Sci
89    No     Ed
90    Yes    Global

请你帮忙吗?

2 个答案:

答案 0 :(得分:1)

让我们试试这个单行:

df.assign(Col3 = df['Col3'].apply(lambda x: [key for key, value in sspdict.items() if x in value][0]))

或者让我们使用发电机:

df.assign(Col3 = df['Col3'].apply(lambda x: next(key for key, value in sspdict.items() if x in value)))

输出:

   Col1 Col2    Col3
0    12   No     Eva
1    22  Yes     Eva
2    23  Yes  Re Sci
3    35   No      Ed
4    34  Yes  Global
5    46   No  Re Sci
6    89   No      Ed
7    90  Yes  Global

答案 1 :(得分:0)

我建议您更改sspdict数据结构以简化操作,如果sspdict不大于输入数据集,可能会提高性能。它可能是这样的:

dataset = '''Col1  Col2  Col3
12    No     M-EV
22    Yes    G-EV
23    Yes    G-RESC
35    No     M-PO
34    Yes    D-GCLA
46    No     S-RESC
89    No     G-PO
90    Yes    C-GCC
'''

sspdict = {'Eva':["M-EV", "G-EV"],'Re Sci': ['G-RESC', 'M-RESC', 'S-RESC', 'D-RESC'], 'Ed':['G-PO' , 'M-PO'], 'Global':['C-GCC', 'D-GCLA', 'C-LACL']}

lookup_dict = {value: key for key, values in sspdict.items() for value in values}
result = ''
for line in dataset.splitlines()[1:]:
    key = line.split()[2]
    result += line.rstrip(key) + lookup_dict[key] + '\n'

print(result)