Да, я полностью осознаю, что isinstance(-1, np.object)
возвращает True
.
Однако, -1 != "-1"
(очевидно) и в этом моя проблема.
Я прочитал DataFrame
из CSV-файла, где -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
Это действительно правильный путь?
PS. Дополнительные ограничения:
- У меня нет контроля над форматом файла CSV.
- CSV огромен, я бы предпочел работать на
missing_value
, а не на всей таблице.
- Некоторые поля отсутствуют (например,
""
), и это семантически отличается от -1
, поэтому передача na_values=-1
в read_csv
не вариант.
- На самом деле я не просто подсчитываю пропущенные значения, я передаю
df[c]
и missing_value
функции do_complicated_analysis_on_a_series
.