Python 使用字典基于旧列创建新列

Python 使用字典基于旧列创建新列,python,python-2.7,pandas,dictionary,mapping,Python,Python 2.7,Pandas,Dictionary,Mapping,我看到过一些帖子,当字典对每个键使用一个值时,这些帖子是有效的。但是,我想使用一个字典,每个键有多个值 myDict = {'0': ['a', 'b', 'c'], '1': ['e', 'f'], '2': ['z','x','y']} 我想创建一个新列,使所有a、b和c变为0等等,从而: col1, col2 a, 0 f, 1 a, 0 x, 2 e, 1 根据其他几个答案,我尝试了这个方法,但没有成功: df['col2']=df['col1']。应用(lambda x:a表示a,

我看到过一些帖子,当字典对每个键使用一个值时,这些帖子是有效的。但是,我想使用一个字典,每个键有多个值

myDict = {'0': ['a', 'b', 'c'], '1': ['e', 'f'], '2': ['z','x','y']}
我想创建一个新列,使所有
a
b
c
变为
0
等等,从而:

col1, col2
a, 0
f, 1
a, 0
x, 2
e, 1
根据其他几个答案,我尝试了这个方法,但没有成功:
df['col2']=df['col1']。应用(lambda x:a表示a,b表示myDict.items()中的b,如果x表示b)


我的另一个想法是创建一个像
{'a':'0','b':'0'}
这样的字典,并映射它,但是如果我的列表很长(每个键都有一个30个值的列表),我想知道一个更简洁的方法。或者这是最好的方法吗?

让我们使用
系列
堆栈

pd.Series(myDict).apply(pd.Series).stack().reset_index(level=0)
Out[353]: 
  level_0  0
0       0  a
1       0  b
2       0  c
0       1  e
1       1  f
0       2  z
1       2  x
2       2  y
更新

s=pd.Series(myDict).apply(pd.Series).stack().reset_index(level=0).set_index(0)['level_0']
s.get(df.col1)
Out[372]: 
col1
a    0
f    1
a    0
x    2
e    1
Name: level_0, dtype: object

考虑到col1只包含这些值“a”、“b”、“c”、“e”等),您可以使用以下值:

myDict = {'a':0, 'b':'0', 'c':'0', 'e':'1', 'f':'1', 'z':'2', 'x':'2', 'y':'2'}
df.col1.map(myDict)

您可以使用列表理解并将其输入到
pd.DataFrame
。这通常比操作现有数据帧更有效

import pandas as pd

d = {'0': ['a', 'b', 'c'], '1': ['e', 'f'], '2': ['z','x','y']}

df = pd.DataFrame([[w, k] for k, v in d.items() for w in v],
                  columns=['col1', 'col2'])

print(df)

  col1 col2
0    a    0
1    b    0
2    c    0
3    e    1
4    f    1
5    z    2
6    x    2
7    y    2

谢谢所以我会把它转换成一个类似于@tobsecret建议的字典,然后把字典映射到我的原始列上?这就是你的想法吗?@As3adTintin是的,你可以试试它,汉克斯!似乎nans已经放弃了这一点,将
np.nan:np.nan
添加到字典中也无济于事。对此有什么建议吗?到目前为止,我一直都在使用它(如果将来有人读到它的话。它是有效的,但不确定它是否理想。再次感谢你的帮助,温。
myDict=pd.Series(eduDict)。apply(pd.Series)。stack()。reset_index(level=0)。set_index(0)['level_0']。to_dict()
df['col2']=df['col1'].map(myDict)
谢谢,但我想在现有列的基础上创建一个新列,而不仅仅是创建一个具有唯一组合的新df