根据具有两个条件的其他列值创建新列并将NaN转换为空白

时间:2017-10-25 10:13:11

标签: python excel pandas

我对pandas代码有一个小问题。我使用np.where命令根据条件创建一个新列并返回1或0.但是对于np.where,NaN值返回为0,但我想将它们作为空格返回。如果我理解正确的np.where,那是不可能直接的。 x y z q被定义为索引。我可以通过以下方式实现这一目标:

   column1
x    NaN
y    Yes
z    No
q    Maybe

df.fillna("EMPTY", inplace=True)
df["column2"] = np.where((df["column1"]=="Yes")|(df["column1"]=="Maybe"), 1, np.where(df["column1"]=="EMPTY", "", 0)) 

   column1   column2
x   EMPTY       ""  
y   Yes         1 
z   No          0
q   Maybe       1

因此它测试column1是否包含值"是"或者"可能"如果true返回1,如果为false则检查它是否包含" EMPTY"如果true返回空白,如果返回false,则使用fillna将空白NaN替换为EMPTY。这有效但是当它写入excel时,所有值都存储为文本而不是数字,因为我使用""在值为EMPTY(最初为NaN)的行中填充空白。

这可以通过pd.to_numeric来解决,它将值转换为1.0和0.0并在空白处创建NaN。当再次使用fillna("")时,我能够提出请求的结果,但是有更有效的方法来实现以下结果吗?在将数据框导入excel时,将值存储为数字非常重要,并且NaN值为空白。

1 个答案:

答案 0 :(得分:0)

  

是否有更有效的方法来实现以下结果?

是。一种方法是将dict传递给df.replace,它应该可以很好地工作。

x = {np.nan: '', 'No': 0, 'Yes': 1, 'Maybe': 1}
df.replace(x)

  column1
x        
y       1
z       0
q       1

如果要将此应用于单个列,则过程相同。只需稍后再分配结果。

df.column1 = df.column1.replace(x)
df

  column1
x        
y       1
z       0
q       1