首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法比较类型'ndarray(dtype=int64)‘和'int64’

无法比较类型'ndarray(dtype=int64)‘和'int64’
EN

Stack Overflow用户
提问于 2018-09-07 15:38:18
回答 1查看 5.1K关注 0票数 3

我的数据中有一列有条形码,并创建了一个字典来将条形码映射到项ids。

我正在创建一个新的专栏:

代码语言:javascript
复制
df['item_id'] = df['bar_code']

字典(第二个数据集- imdb -)

代码语言:javascript
复制
keys = (int(i) for i in imdb['bar_code'])
values = (int(i) for i in imdb['item_id'])
map_barcode = dict(zip(keys, values))

map_barcode (前5例)

{0: 1000159,9000000017515: 11,7792690324216: 16,7792690324209: 20,70942503334: 33}

,然后用dict映射项id。

代码语言:javascript
复制
df = df.replace({'item_id':map_barcode})

在这里,我希望获得列中的项目ids。

(回到dict示例:)

代码语言:javascript
复制
df['item_id'][0] = 1000159
df['item_id'][1] = 11
df['item_id'][2] = 16
df['item_id'][3] = 20
df['item_id'][4] = 33

但是最终得到了这个错误:

代码语言:javascript
复制
Cannot compare types 'ndarray(dtype=int64)' and 'int64' 

我试图将字典的类型更改为np.int64

代码语言:javascript
复制
keys = (np.int64(i) for i in imdb['bar_code'])
values = (np.int64(i) for i in imdb['item_id'])
map_barcode = dict(zip(keys, values))

但也有同样的错误。

这里有我遗漏的东西吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-07 15:59:52

replace实例

首先,我不能重复你的错误。这样做很好:

代码语言:javascript
复制
map_dict = {0: 1000159, 9000000017515: 11, 7792690324216: 16, 7792690324209: 20, 70942503334: 33}

df = pd.DataFrame({'item_id': [0, 7792690324216, 70942503334, 9000000017515, -1, 7792690324209]})

df = df.replace({'item_id': map_dict})

结果:

代码语言:javascript
复制
   item_id
0  1000159
1       16
2       33
3       11
4       -1
5       20

使用map + fillna代替

其次,在生成器表达式中手动迭代Pandas系列是相对昂贵的。此外,replace在通过字典进行映射时效率很低。

事实上,创建一本词典甚至都是不必要的。对于这些任务,有一些优化的基于系列的方法:

代码语言:javascript
复制
map_series = imdb[['bar_code', 'item_id']].astype(int).set_index('bar_code')['item_id']

df['item_id'] = df['item_id'].map(map_series).fillna(df['item_id'])

另请参阅:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52225770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档