首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在划分对齐的DataFrame列时获取NaN

在划分对齐的DataFrame列时获取NaN
EN

Stack Overflow用户
提问于 2021-10-26 14:27:16
回答 3查看 43关注 0票数 0

我有一个表格的数据框架:

代码语言:javascript
复制
            A             B               C
Cat-1    798.26        456.65          187.56
Cat-2 165165.53      45450.00         4897.57
Cat-3 488565.65      15198.56        15654.65
Cat-4      0.00      54256.35        49878.65
Cat-5   1156.61        789.05        89789.54
Cat-6      0.00       1644.78         6876.15

我试图通过B除以A来获得一个百分比。为此,我使用了以下方法:

代码语言:javascript
复制
if_condition = df['A'] != 0
then = (1 - df['B'].div(df['A']))
else_= 0
df['New Col'] = np.where(if_condition, then, else_)

我所期望的结果如下:

代码语言:javascript
复制
            A             B               C       New Col
Cat-1    798.26        456.65          187.56        .5720
Cat-2 165165.53      45450.00         4897.57        .2751 
Cat-3 488565.65      15198.56        15654.65        .0311
Cat-4      0.00      54256.35        49878.65        0
Cat-5   1156.61        789.05        89789.54        .6822
Cat-6      0.00       1644.78         6876.15        0

然而,我得到了以下结果:

代码语言:javascript
复制
            A             B               C        New Col
Cat-1    798.26        456.65          187.56        NaN
Cat-2 165165.53      45450.00         4897.57        0.2751 
Cat-3 488565.65      15198.56        15654.65        0.0311
Cat-4      0.00      54256.35        49878.65        0
Cat-5   1156.61        789.05        89789.54        NaN
Cat-6      0.00       1644.78         6876.15        0

我已经尝试了一些其他的解决方案,包括两列的对齐,但是这并没有改变最终的结果。什么可能会生成这些NaN值?

EN

回答 3

Stack Overflow用户

发布于 2021-10-26 14:39:38

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

df = pd.read_csv(io.StringIO("""            A             B               C
Cat-1    798.26        456.65          187.56
Cat-2     165165.53      45450.00         4897.57
Cat-3     488565.65      15198.56        15654.65
Cat-4      0.00      54256.35        49878.65
Cat-5   1156.61        789.05        89789.54
Cat-6      0.00       1644.78         6876.15"""), sep="\s\s+", engine="python")

df

# output
               A         B         C
Cat-1     798.26    456.65    187.56
Cat-2  165165.53  45450.00   4897.57
Cat-3  488565.65  15198.56  15654.65
Cat-4       0.00  54256.35  49878.65
Cat-5    1156.61    789.05  89789.54
Cat-6       0.00   1644.78   6876.15

if_condition = df['A'] != 0
then = (1 - df['B'].div(df['A']))
else_= 0
df['New Col'] = np.where(if_condition, then, else_)

# output
               A         B         C   New Col
Cat-1     798.26    456.65    187.56  0.427943
Cat-2  165165.53  45450.00   4897.57  0.724822
Cat-3  488565.65  15198.56  15654.65  0.968891
Cat-4       0.00  54256.35  49878.65  0.000000
Cat-5    1156.61    789.05  89789.54  0.317791
Cat-6       0.00   1644.78   6876.15  0.000000

看起来是对的。我使用pandas版本'1.2.5‘

同样,你也可以更容易地完成这个"if else“条件:

代码语言:javascript
复制
df["New col"] = df.apply(lambda x: 1 - x["B"] / x["A"] if x["A"] != 0 else 0, axis=1)
票数 0
EN

Stack Overflow用户

发布于 2021-10-26 14:41:49

您不需要条件,请将-np.inf替换为0:

代码语言:javascript
复制
# df['New Col'] = (1 - df['B'] / df['A']).replace(-np.inf, 0)
df['New Col'] = ((1 - df['B'] / df['A']) * 100).round(2).replace(-np.inf, 0)
print(df)

# Output:
               A         B         C  New Col
Cat-1     798.26    456.65    187.56    42.79
Cat-2  165165.53  45450.00   4897.57    72.48
Cat-3  488565.65  15198.56  15654.65    96.89
Cat-4       0.00  54256.35  49878.65     0.00
Cat-5    1156.61    789.05  89789.54    31.78
Cat-6       0.00   1644.78   6876.15     0.00
票数 0
EN

Stack Overflow用户

发布于 2021-10-27 08:50:14

我能够解决这个问题,只需简单地不减少0,然后将NaN值替换为0。它产生了预期的结果:

代码语言:javascript
复制
df['New Col'] = (1 - df['B']/df['A'][df['A'] != 0]).fillna(0)

我基本上可以除以除0之外的所有值,剩余的NaN值是不除以0的结果,因此可以用0替换。

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

https://stackoverflow.com/questions/69724974

复制
相关文章

相似问题

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