将数据帧与字典值列表进行比较

时间:2018-03-19 15:26:12

标签: python pandas dictionary

我有一个数据框:

d = {'col1':['2q','48', '48-49']}
test = pd.DataFrame(d)


col1

0 2q
1 48 
2 48-49 

用于制图的字典:

mupcs_to_pc_mapping = {'24': ['48-49', '48', '49'], #M2
                   '23': ['50-51', '50', '51'], #M3
                   '22': ['52-53', '52', '53'], #M4
                   '21': ['54-55', '54', '55'], #M5
                  }

我想测试测试数据帧的每个值,看它是否存在于mupcs_to_pc_mapping dict值中。

所以最终的结果是:

0 False
1 True
2 True

我尝试了一种变体:

test['col1'].isin(mupcs_to_pc_mapping.values())

test['col1'].any(value for value in mupcs_to_pc_mapping.values())

但两者都会导致错误。

有谁知道我的代码出了什么问题?

4 个答案:

答案 0 :(得分:5)

你也可以这样做:

test.isin(pd.DataFrame(mupcs_to_pc_mapping).stack().values)

   col1
0  False
1  True
2  True

答案 1 :(得分:4)

我认为你需要

test.col1.isin(sum(mupcs_to_pc_mapping.values(),[]))
Out[477]: 
0    False
1     True
2     True
Name: col1, dtype: bool

在评论itertools.chain

中提及冷
list(itertools.chain.from_iterable(mupcs_to_pc_mapping.values()))

答案 2 :(得分:3)

首先,反转您的映射:

m = {v : k for k in mupcs_to_pc_mapping for v in  mupcs_to_pc_mapping[k]}

现在,使用map并测试NaN s。

test.col1.map(m).notnull()

0    False
1     True
2     True
Name: col1, dtype: bool

答案 3 :(得分:3)

创建一个集合,它是所有字典值的并集

test.col1.isin(set.union(*map(set, mupcs_to_pc_mapping.values())))

0    False
1     True
2     True
Name: col1, dtype: bool