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

时间:2018-04-26 21:56:43

标签: python python-2.7 pandas dictionary mapping

我看到一些帖子在字典每个键使用一个值时起作用。但是,我想使用每个键具有多个值的字典。

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

我想创建一个新列,以便所有abc变为0等等,从而产生:

col1, col2
a, 0
f, 1
a, 0
x, 2
e, 1

基于其他几个答案,我试过这个,但它不起作用: df['col2'] = df['col1'].apply(lambda x: a for a, b in myDict.items() if x in b)

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

3 个答案:

答案 0 :(得分:0)

让我们将Seriesstack

一起使用
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

答案 1 :(得分:0)

鉴于您的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)

答案 2 :(得分:0)

您可以使用列表推导并输入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