【发布时间】:2019-02-19 12:17:05
【问题描述】:
是的,我完全知道isinstance(-1, np.object) 返回True。
但是,-1 != "-1"(显然)这是我的问题。
我从一个 CSV 文件中读取了一个 DataFrame,其中 -1 用于表示丢失的数据:
Numbers,Strings
1,A
2,-1
-1,B
和read_csv 产生:
Numbers Strings
0 1 A
1 2 -1
2 -1 B
dtypes
Numbers int64
Strings object
dtype: object
我有一个missing_value 变量,即-1 和
>>> missing_value = -1
>>> for c in z.columns:
print(c,(z[c] == missing_value).sum())
Numbers 1
Strings 0
>>> (z.Strings == str(missing_value)).sum()
1
我明白为什么会发生这种情况。 我的问题是如何修改循环以便 DTRT:
for c in z.columns:
print(c,(z[c] == (missing_value if np.issubdtype(z[c].dtype,np.number) else str(missing_value))).sum())
Numbers 1
Strings 1
这真的是正确的方法吗?
附言。额外的约束:
- 我无法控制 CSV 文件格式。
- CSV 很大,我宁愿对
missing_value进行操作,也不愿对整个表进行操作。 - 缺少某些字段(例如
""),这在语义上与-1不同,因此不能将na_values=-1传递给read_csv。 - 实际上我不只是计算缺失值,我将
df[c]和missing_value传递给函数do_complicated_analysis_on_a_series。
【问题讨论】:
-
为什么不从一开始就告诉 pandas 将 -1 视为 NaN?
pd.read_csv('yourfile.csv',na_values=-1) -
@DYZ:因为确实缺少某些字段(因此读作
na) -
@sds:为什么这会阻止你使用
na_values? -
@user2357112:因为我不希望
""与-1被同等对待。 -
好的,另一种选择是将数据帧转换为字符串并将其与“-1”进行比较。
(z.astype('str')=="-1").sum()
标签: python python-3.x pandas numpy type-conversion