Как привести целое число к np.object? - PullRequest
0 голосов
/ 14 сентября 2018

Да, я полностью осознаю, что 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. Дополнительные ограничения:

  1. У меня нет контроля над форматом файла CSV.
  2. CSV огромен, я бы предпочел работать на missing_value, а не на всей таблице.
  3. Некоторые поля отсутствуют (например, ""), и это семантически отличается от -1, поэтому передача na_values=-1 в read_csv не вариант.
  4. На самом деле я не просто подсчитываю пропущенные значения, я передаю df[c] и missing_value функции do_complicated_analysis_on_a_series.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Как насчет разделения объекта и числовых столбцов и обработки их по-разному?

part1 = (z.loc[:, z.dtypes != np.object] == -1).sum()
#Numbers    1
#dtype: int64
part2 = (z.loc[:, z.dtypes == np.object] == str(-1)).sum()
#Strings    1
#dtype: int64

При необходимости результаты могут быть объединены в один кадр данных.

np.concat([part1, part2])
0 голосов
/ 14 сентября 2018

Мы можем исправить ваш вывод на isin

df.isin([-1,'-1']).sum()

Out[276]: 
Numbers    1
Strings    1
dtype: int64
...