根据 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
-> True
是1
和False
是0
:
要使用missing data
,必须使用isnull
或notnull
等特殊功能,请查看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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Python:替换数组中的 NaN 或 MEAN 而不是 -999 值[重复]