【问题标题】:Cannot compare types 'ndarray(dtype=int64)' and 'str' while trying to replace dataframe values with values from a map尝试用地图中的值替换数据帧值时无法比较类型“ndarray(dtype=int64)”和“str”
【发布时间】:2021-01-12 06:01:55
【问题描述】:

我有一个包含两种不同数据类型(int64 和 str)的字典和一个数据框。我正在尝试将我的 df 第二列中的数据替换为 dict 中的值(如果它们匹配)。

例如-

Input:
    map = {'Pop': [9, 11, 13], 'HipHop': [15, 19, 22], 'Unknown': '_'}
    
    artist = {'Name': ['Taylor','Kanye','Alex'],'Reference': [9,15,_]}
    df = pd.DataFrame(artist, columns = ['Name', 'Reference'])


Expected Output:
output_dict = {'Taylor': 'Pop', 'Kanye': 'HipHop', 'Alex': 'Unknown'}

我的代码如下:

    df['Reference'] = df.Reference.astype('int64')
    out = df.set_index('Name').Reference.replace({z : x for x , y in map.items() for z in y}).to_dict()
    print(out)

我面临的问题是,如果我不将第二列转换为 int64,我将无法使映射工作。但是,一旦我进行转换,我就会得到一个无法比较类型的错误,因为其中一个字段是一个字符串。有关如何解决此问题的任何提示都会有所帮助。谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    因为map 是函数,而且python 代码字不使用变量map,更好的是更改类似于mapping

    然后将Reference 转换为数字to_numericerrors='coerce' 如果字符串出现错误值,请使用您的解决方案将缺失值替换为Series.fillna

    mapping = {'Pop': [9, 11, 13], 'HipHop': [15, 19, 22], 'Unknown': '_'}
      
    
    artist = {'Name': ['Taylor','Kanye','Alex'],'Reference': [9,15,'_']}
    df = pd.DataFrame(artist, columns = ['Name', 'Reference'])
    
    df['Reference'] = pd.to_numeric(df.Reference, errors='coerce')
    
    out = (df.set_index('Name').Reference
             .replace({z : x for x , y in mapping.items() for z in y})
             .fillna('Unknown')
             .to_dict())
    print(out)
    {'Taylor': 'Pop', 'Kanye': 'HipHop', 'Alex': 'Unknown'}
    

    【讨论】:

      【解决方案2】:

      创建一个地图字典,然后应用到Reference 列。

      amap = {'Pop': [9, 11, 13], 'HipHop': [15, 19, 22], 'Unknown': '_'}
      artist = {'Name': ['Taylor','Kanye','Alex'],'Reference': [9,15,'_']}
      df = pd.DataFrame(artist, columns = ['Name', 'Reference'])
      
      # create map dict
      df_map = pd.DataFrame(amap).stack().reset_index()
      map_dict = dict(zip(df_map[0], df_map['level_1']))
      print(map_dict)
      # {9: 'Pop', 15: 'HipHop', '_': 'Unknown', 11: 'Pop', 19: 'HipHop', 13: 'Pop', 22: 'HipHop'}
      
      # apply map dict
      df['amap'] = df['Reference'].map(map_dict)
      dict(zip(df['Name'], df['amap']))
      # {'Taylor': 'Pop', 'Kanye': 'HipHop', 'Alex': 'Unknown'}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-12
        • 2020-05-05
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多