【问题标题】:Create new column based on old column using a dictionary使用字典基于旧列创建新列
【发布时间】:2018-10-07 17:01:44
【问题描述】:

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

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 个值的列表),我想知道一种更简洁的方法。或者这是最好的方法?

【问题讨论】:

    标签: python python-2.7 pandas dictionary mapping


    【解决方案1】:

    让我们使用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
    

    【讨论】:

    • 谢谢!所以我会将其转换为类似于@tobsecret 建议的字典,然后将该字典映射到我的原始列?这就是你的想法吗?
    • @As3adTintin 是的,你可以试试
    • 谢谢!似乎 nans 正在抛弃这个并将np.nan : np.nan 添加到字典中并没有帮助。有什么建议吗?
    • 到目前为止我已经完成了这个(如果将来有人读到这个。它有效,不确定它是否理想。再次感谢你的帮助,Wen。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)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 谢谢,但我想根据现有列创建一个新列,而不仅仅是创建一个具有独特组合的新 df
      猜你喜欢
      • 2020-09-12
      • 2017-08-03
      • 1970-01-01
      • 2020-04-06
      • 2022-07-06
      • 2021-11-29
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多