首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理np.select中缺少的值

处理np.select中缺少的值
EN

Stack Overflow用户
提问于 2021-02-23 07:43:11
回答 3查看 359关注 0票数 1

我正试图为我的熊猫DataFrame写一个新的专栏“分数”。

我发现最好的方法是使用np.select()函数。

然而,我的dataframe中有一些丢失的值,为此我想返回False,但没有找到这样做的方法。

最后一次尝试如下所示:

代码语言:javascript
复制
score_conditions = [
    ((df['column1']).replace({'<NA>': np.nan}).fillna(False) > 15),
    (df['column2'] > 5),
    (df['column3'] < 1)
]   
score_choices = [3, 2, 1]

df['Score'] = np.select(score_conditions, score_choices, default=0)

我有点迷失在熊猫的NA和numpy NaN之间的差异,这可能是不同的?当前<NA>通常是Int64列的一部分。

我在大多数列中丢失了值(可能比10个条件列少5个),但仍然希望在一个或多个值可用时计算分数。

下面是一个示例dataframe:

代码语言:javascript
复制
df = DataFrame({'column1' : [5,16,<NA>,24], 'column2' : [5,6,3,1], 'column3' : [<NA>,0,0,<NA>]})

预期结果将是:

代码语言:javascript
复制
For index 0: 0 #zero condition are met, when values are available
For index 1: 3 #all conditions are met
For index 2: 1 #only condition in 3rd columns is met, when values are available
For index 3: 1 #only condition in 1st columns is met, when values are available

谢谢,

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-23 08:25:43

第一个想法是把熊猫升级到最后一个版本。

另一个想法是通过将值转换为浮动将NA转换为np.nan

代码语言:javascript
复制
df['column1'] > 15

至:

代码语言:javascript
复制
df['column1'].astype(float) > 15
票数 0
EN

Stack Overflow用户

发布于 2021-02-23 08:43:09

我觉得这可能是个小语法问题。基本上,应该是双引号,因为它不是一条土生土长的蟒蛇或熊猫,也不是numpy数据类型。此时,列变成类型(‘O’),表示它们是对象。我稍微修改了您的代码,得到了一个答案,尽管它并不完全符合预期的分数值,但它的工作原理与设计完全相同:

代码语言:javascript
复制
df = pd.DataFrame({'column1' : [5,16,"<NA>",24], 'column2' : [5,6,3,1], 'column3' : ["<NA>",0,0,"<NA>"]})


score_conditions = [
    ((df['column1']).replace({'<NA>': np.nan}).fillna(False) > 15),
    (df['column2'] > 5),
    (df['column3'].replace({'<NA>': np.nan}).fillna(False) < 1)
]   
score_choices = [3, 2, 1]

df['Score'] = np.select(score_conditions, score_choices, default=0)
票数 0
EN

Stack Overflow用户

发布于 2021-02-23 10:12:28

数据类型确实很重要,而且无论如何,fillna都是您所需要的。

让我们用你的例子:

代码语言:javascript
复制
df = pd.DataFrame({'column1' : [5,16,pd.NA,24], 'column2' : [5,6,3,1], 'column3' : [pd.NA,0,0,pd.NA]})
>>> score_conditions = [
    (df['column1'] > 15),
    (df['column2'] > 5),
    (df['column3'] < 1)
]
>>> for i in score_conditions: print(i)

0    False
1     True
2    False
3     True
Name: column1, dtype: bool
0    False
1     True
2    False
3    False
Name: column2, dtype: bool
0    False
1     True
2     True
3    False
Name: column3, dtype: bool

您可以直接获得预期的值,因为这些列具有object数据类型:

代码语言:javascript
复制
>>> print(df.dtypes)
column1    object
column2     int64
column3    object
dtype: object

但是在一条评论中,您解释了您的列有Int64数据类型(注意大写I)。所以让我们强制使用这种数据类型:

代码语言:javascript
复制
>>> df = pd.DataFrame({'column1' : [5,16,pd.NA,24], 'column2' : [5,6,3,1], 'column3' : [pd.NA,0,0,pd.NA]}, dtype=pd.Int64Dtype())
>>> score_conditions = [
    (df['column1'] > 15),
    (df['column2'] > 5),
    (df['column3'] < 1)
]
>>> for i in score_conditions: print(i)

0    False
1     True
2     <NA>
3     True
Name: column1, dtype: boolean
0    False
1     True
2    False
3    False
Name: column2, dtype: boolean
0    <NA>
1    True
2    True
3    <NA>
Name: column3, dtype: boolean

Patatras,我们找到了您想要避免的<NA>值!至少它再现了你的问题..。

解决方案是fillna

代码语言:javascript
复制
>>> score_conditions = [
    (df['column1'] > 15).fillna(False),
    (df['column2'] > 5).fillna(False),
    (df['column3'] < 1).fillna(False)
]
>>> for i in score_conditions: print(i)

0    False
1     True
2    False
3     True
Name: column1, dtype: boolean
0    False
1     True
2    False
3    False
Name: column2, dtype: boolean
0    False
1     True
2     True
3    False
Name: column3, dtype: boolean

不需要浮点转换..。

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

https://stackoverflow.com/questions/66328963

复制
相关文章

相似问题

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