根据NaN值将列值替换为0或1

21 浏览
0 Comments

根据NaN值将列值替换为0或1

这个问题已经在此处有答案

Series的真值是模棱两可的。使用a.empty、a.bool()、a.item()、a.any()或a.all()

这里是CSV数据的快照,

文件

我想将列\'Death Year\'中的null或\'nan\'值替换为0,并将所有其他条目替换为1:

import pandas as pd
import numpy as np
mydata_csv = pd.read_csv('D:\Python\character-deaths.csv',sep = ',',encoding = 'utf-8')
mydata_csv
del mydata_csv['Book of Death']
del mydata_csv['Death Chapter']
if mydata_csv['Death Year'] == np.nan:
 mydata_csv['Death Year'] = 0
else:
 mydata_csv['Death Year'] = 1

以上代码产生以下错误:

ValueError: Series的真值是模棱两可的。使用a.empty、a.bool()、a.item()、a.any()或a.all()。

admin 更改状态以发布 2023年5月21日
0
0 Comments

你没有具体说明是哪一行,但我猜测你的问题出在

if mydata_csv['Death Year'] == np.nan:

如果是的话,试着先检查一下这一列是否有数据,可以类似这样:

if mydata_csv['Death Year'] is not None and mydata_csv['Death Year'] == np.nan:

希望可以帮到你。

0
0 Comments

你有两个问题:

  1. 对于一个序列/数据框的逻辑操作不能产生标量结果。它会生成一个向量,if无法理解。

  2. NaN != NaN;即使列是NaN时,你的if条件也永远不会成立。

    In [9]: np.nan == np.nan
    Out[9]: False
    


只需使用np.where

mydata_csv['Death Year'] = np.where(mydata_csv['Death Year'].isnull(), 0, 1)

我建议另一个改进是在删除列时使用df.drop。尝试更具有面向数据的版本而不是使用del

mydata_csv = mydata_csv.drop(['Book of Death', 'Death Chapter'], 1)

0