[英]Getting NaN when Dividing Aligned DataFrame Columns
我有一個如下形式的數據框:
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 來獲得百分比。為此,我使用了以下內容:
if_condition = df['A'] != 0
then = (1 - df['B'].div(df['A']))
else_= 0
df['New Col'] = np.where(if_condition, then, else_)
我期待以下結果:
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
但是,我得到了以下結果:
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 值?
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
似乎是正確的。 我使用熊貓版本'1.2.5'
您也可以更輕松地執行此“if else”條件:
df["New col"] = df.apply(lambda x: 1 - x["B"] / x["A"] if x["A"] != 0 else 0, axis=1)
您不需要條件,將-np.inf
替換為 0:
# 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,然后用 0 替換NaN
值。它產生了預期的結果:
df['New Col'] = (1 - df['B']/df['A'][df['A'] != 0]).fillna(0)
我基本上能夠除以 0 以外的所有內容,其余的 NaN 值是不除以 0 的結果,因此可以用 0 代替。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.