我有一个表格的数据框架:
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值?
发布于 2021-10-26 14:39:38
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“条件:
df["New col"] = df.apply(lambda x: 1 - x["B"] / x["A"] if x["A"] != 0 else 0, axis=1)发布于 2021-10-26 14:41:49
您不需要条件,请将-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发布于 2021-10-27 08:50:14
我能够解决这个问题,只需简单地不减少0,然后将NaN值替换为0。它产生了预期的结果:
df['New Col'] = (1 - df['B']/df['A'][df['A'] != 0]).fillna(0)我基本上可以除以除0之外的所有值,剩余的NaN值是不除以0的结果,因此可以用0替换。
https://stackoverflow.com/questions/69724974
复制相似问题