【问题标题】:Pandas: mapping with dict using more than 1 columnPandas:使用超过 1 列与 dict 进行映射
【发布时间】:2017-11-14 09:29:11
【问题描述】:

我得到了基本的 DataFrame:

df = pd.DataFrame([[1, 2],[3, 4],[5, 6],[7, 8]],
                  index=['A','B','C','D'], columns=['X','Y'])

我希望 map 函数在 X 和 Y 列上工作并获得:

   X  Y  Chk
A  1  2  found A
B  3  4  found B
C  5  6  found C
D  7  8  found D

为此,我为 2 个键创建了一个字典:

mapped = {1:{2:'found A'}, 3:{4:'found B'},5:{6:'found C'}, 7:{8:'found D'}}

并在DataFrame上使用了applymap方法:

df['Chk'] = df[['X','Y']].applymap(mapped)

很遗憾,我收到一条错误消息:

TypeError: ("'dict' object is not callable", 'occurred at index X')

是代码错了,还是基于字典的映射根本不支持超过 1 列?

【问题讨论】:

    标签: python-3.x pandas python-applymap


    【解决方案1】:

    先创建DataFrame,然后使用MultiIndex创建Series stack,然后创建join

    s = pd.DataFrame(mapped).stack().rename('Chk')
    print (s)
    2  1    found A
    4  3    found B
    6  5    found C
    8  7    found D
    Name: Chk, dtype: object
    
    df = df.join(s, on=['Y','X'])
    print (df)
       X  Y      Chk
    A  1  2  found A
    B  3  4  found B
    C  5  6  found C
    D  7  8  found D
    

    如果可能,创建DataFrame 进行映射,然后使用merge

    mapped = {'X': [1, 3, 5, 7], 
             'Chk': ['found A', 'found B', 'found C', 'found D'],
             'Y': [2, 4, 6, 8]}
    
    df1 = pd.DataFrame(mapped)
    print (df1)
           Chk  X  Y
    0  found A  1  2
    1  found B  3  4
    2  found C  5  6
    3  found D  7  8
    
    df = pd.merge(df, df1, how='left', on=['X','Y'])
    print (df)
       X  Y      Chk
    0  1  2  found A
    1  3  4  found B
    2  5  6  found C
    3  7  8  found D
    

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 2016-06-08
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      相关资源
      最近更新 更多