【问题标题】:np.where( ) not changing all the valuesnp.where( ) 没有改变所有的值
【发布时间】:2022-01-17 15:53:32
【问题描述】:
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 的等级对视图进行评分。我想使用此操作将它们更改为字符串,但是这段代码仅适用于第一行。

df['view'].value_counts()

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

如何让 np.where() 也适用于其他人?

【问题讨论】:

  • 在第一个np.where之后,该列的数据类型变为object以将字符串整数保持在一起。所以1、2、3、4在第一行之后都变成了“1”,……后面的np.wheres都没有生效。

标签: python pandas numpy


【解决方案1】:

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

这段代码可以工作:

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 的“在哪里”工作,我认为上面是这样。但值得一提的是,pandas apply 在这里也可以很好地工作,使用字典进行映射,其他答案会更好。

【讨论】:

  • 感谢您的诚实@houseofleft 以及在第一个np.where 之后对数据类型的出色解释。 +1
【解决方案2】:

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

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

我使用的设置:

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 之后,您的数据如下所示:

>>> 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'(字符串)。因此,您现在无法检查整数值。这就是为什么一次性处理数据很重要的原因。

【讨论】:

    【解决方案3】:

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

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多