【问题标题】:Replace column values with 0 or 1 based on NaNs [duplicate]根据 NaN 将列值替换为 0 或 1 [重复]
【发布时间】:2018-03-12 04:51:29
【问题描述】:

这是 CSV 数据的快照, file.

我想用 0 替换空值或“nan”值,并将“死亡年份”列中的所有其他条目替换为 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()。

【问题讨论】:

标签: python pandas dataframe replace nan


【解决方案1】:

你有两个问题:

  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)

【讨论】:

    【解决方案2】:

    您没有指定哪一行,但我怀疑您的问题出在

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

    如果是这样,请尝试检查列是否首先有数据,类似于

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

    希望对你有帮助

    【讨论】:

    • 这无济于事。这是不正确的。
    【解决方案3】:

    我认为最好将notnull 用作布尔掩码,然后将其转换为int -> True1False0

    要使用missing data,必须使用isnullnotnull 等特殊功能,请查看docs 了解更多信息。

    #omit `sep=','` because default parameter
    mydata_csv = pd.read_csv('D:\Python\character-deaths.csv', encoding = 'utf-8')
    #simplify double del
    mydata_csv = mydata_csv.drop(['Book of Death', 'Death Chapter'], axis=1)
    mydata_csv['Death Year'] = mydata_csv['Death Year'].notnull().astype(int)
    

    示例:

    mydata_csv = pd.DataFrame({'Book of Death':[4,5,4,5,5,4],
                               'Death Chapter':[7,8,9,4,2,3],
                               'Death Year':[np.nan,3,5,np.nan,1,0],
                               'col':[7,8,9,4,2,3]})
    
    print (mydata_csv)   
       Book of Death  Death Chapter  Death Year  col
    0              4              7         NaN    7
    1              5              8         3.0    8
    2              4              9         5.0    9
    3              5              4         NaN    4
    4              5              2         1.0    2
    5              4              3         0.0    3
    
    mydata_csv = mydata_csv.drop(['Book of Death', 'Death Chapter'], axis=1)
    mydata_csv['Death Year'] = mydata_csv['Death Year'].notnull().astype(int)
    print (mydata_csv)   
       Death Year  col
    0           0    7
    1           1    8
    2           1    9
    3           0    4
    4           1    2
    5           1    3
    

    【讨论】:

      【解决方案4】:
      猜你喜欢
      • 1970-01-01
      • 2019-11-10
      • 2013-03-12
      • 1970-01-01
      • 2021-06-27
      • 2017-07-30
      • 2018-02-23
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多