尝试用映射中的值替换数据帧值时,无法比较类型“ndarray(dtype=int64)”和“str”

2024-09-28 03:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两种不同数据类型(int64和str)的字典和一个数据帧。我试图用dict中的值替换df第二列中的数据,如果它们匹配的话

例如—

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,则无法使映射正常工作。但是,一旦我转换了,我会得到一个“无法比较类型”错误,因为其中一个字段是字符串。任何关于如何解决这一问题的提示都会很有帮助。谢谢


Tags: 数据namemapdfartistoutpopdict
2条回答

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

然后使用^{}errors='coerce'Reference转换为数字,如果字符串中存在错误值,请使用^{}替换缺少的值的解决方案

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'}

创建映射dict,然后应用于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'}

相关问题 更多 >

    热门问题