首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >np.where( )没有更改所有值

np.where( )没有更改所有值
EN

Stack Overflow用户
提问于 2022-01-17 15:53:32
回答 3查看 264关注 0票数 3
代码语言:javascript
复制
df['view'] = np.where(df['view']==0, 'No view', df['view'])
df['view'] = np.where(df['view']==1, 'Mediocore', df['view'])
df['view'] = np.where(df['view']==2, 'Average', df['view'])
df['view'] = np.where(df['view']==3, 'Good', df['view'])
df['view'] = np.where(df['view']==4, 'Very good', df['view'])

我有一个房价数据集,其中“视图”栏对视图的评级为1-4。我想使用这个操作将这些代码转换为字符串,但是这段代码只适用于第一行。

代码语言:javascript
复制
df['view'].value_counts()

-No view    4140
 2           205
 3           116
 4            70
 1            69
 Name: view, dtype: int64

我如何使np.where()也能为其他人工作?

EN

回答 3

Stack Overflow用户

发布于 2022-01-17 16:04:18

Numpy将在第一次调用时将数组转换为字符串,这意味着列中不再有1,而是“1”。

此代码将起作用:

代码语言:javascript
复制
df['view'] = np.where(df['view']==0, 'No view', df['view'])
df['view'] = np.where(df['view']=='1', 'Mediocore', df['view'])
df['view'] = np.where(df['view']=='2', 'Average', df['view'])
df['view'] = np.where(df['view']=='3', 'Good', df['view'])
df['view'] = np.where(df['view']=='4', 'Very good', df['view'])

我知道你问过如何让numpy的“哪里”去工作,我认为上面的方法是这样的。但是值得一提的是,熊猫申请在这里可能也会很好,用字典进行映射--就像列出的那样--另一个答案会更好。

票数 4
EN

Stack Overflow用户

发布于 2022-01-17 16:00:51

尝试映射值,以避免出现dtype问题:

代码语言:javascript
复制
mappings = {0: 'No view', 1: 'Mediocre', 2: 'Average', 3: 'Good', 4: 'Very good'}

df['view'] = df['view'].map(mappings)
print(df)

# Output
        view
0  Very good
1    No view
2   Mediocre
3   Mediocre
4    No view
5    No view
6    Average
7    No view
8    No view
9   Mediocre

我使用的设置:

代码语言:javascript
复制
import pandas as pd
import numpy as np

np.random.seed(2022)
df = pd.DataFrame({'view': np.random.randint(0, 5, 10)})
print(df)

# Output
   view
0     4
1     0
2     1
3     1
4     0
5     0
6     2
7     0
8     0
9     1

更新

在第一个np.where之后,您的数据如下所示:

代码语言:javascript
复制
>>> np.where(df['view']==0, 'No view', df['view'])
array(['4', 'No view', '1', '1', 'No view', 'No view', '2', 'No view',
       'No view', '1'], dtype='<U21')

剩馀值1, 2, 3, 4 (整数)变为'1', '2', '3', '4' (字符串)。因此,您现在不能检查整数值。这就是为什么,在一次传递中处理数据是很重要的。

票数 2
EN

Stack Overflow用户

发布于 2022-01-17 16:14:18

正如其他答案所描述的,数组将在您的第一行代码之后转换为字符串,但是,您可以重新安排您的代码以一次执行所有内容,这将解决这个问题。

对于多个条件评估,您可能会发现使用numpy.select更容易

代码语言:javascript
复制
v = df['view']

# numpy.where
df['view'] = np.where(v==0, 'No view',
         np.where(v==1,'Mediocre',
                  np.where(v==2,'Average',
                           np.where(v==3,'Good',
                                    np.where(v==4,'Very good',df['view'])))))

# numpy.select
vals  = [v.eq(0), v.eq(1),v.eq(2),v.eq(3),v.eq(4)]
new_vals     = ['No view','Mediocre','Average','Good','Very good']
df['view'] = np.select(vals, new_vals, default=v)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70744100

复制
相关文章

相似问题

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