根据 NaN 将列值替换为 0 或 1 [重复]

Posted

技术标签:

【中文标题】根据 NaN 将列值替换为 0 或 1 [重复]【英文标题】:Replace column values with 0 or 1 based on NaNs [duplicate] 【发布时间】: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()。

【问题讨论】:

很常见。涵盖此内容的其他答案在这里不适用怎么办? ***.com/q/36921951/1531971 【参考方案1】:

你有两个问题:

    对系列/数据帧的逻辑运算不会产生标量结果。它产生一个向量,if 无法理解。

    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】:

参见 df.fillna() 和 df.replace()

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.replace.html

【讨论】:

以上是关于根据 NaN 将列值替换为 0 或 1 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL:将列值链接到列名以满足某些条件

Pandas - 将列值组合到新列中的列表中

在Java中用0替换Nan值[重复]

Python:替换数组中的 NaN 或 MEAN 而不是 -999 值[重复]

Python pandas:选择列值为null / None / nan的行[重复]

根据循环内另一列的值将列的值更改为nan